Finch/tests/run/abi.h
Nexoniarz 1dc976bd8f Structs, arrays, owned strings, memory model, modules, debug info
- struct with default values; constructors Point(1, 2) / Point(x: 1); field access, auto-deref through pointers
- []T arrays with bounds checks, literals, for-each, push/pop/insert/remove/clear/resize/find/contains/join/slice/reverse/sort
- str carries its length: .len, s[i], +, comparison, sub/find/split/trim/upper/lower/replace/repeat/bytes, str(x), int(s), float(s)
- Memory: values own their memory and are freed at the end of their block; assignment copies, temporaries move;
  parameters are lent and only copied when the function changes them; defer; new()/free() for manual heap memory
- input(), read_file/write_file/file_exists, exit(), fn main([]str args)
- Finch modules: import name, module.fn(), module.Struct
- C structs from headers (fields, fixed arrays, nested); passed and returned by value with the System V x86-64 ABI;
  addr(fn) gives C a callback
- link "file.c" compiles and links your own C code
- -g emits DWARF debug info (gdb/lldb)
- Small C runtime (runtime/finch_rt.c) embedded in the compiler, cached in ~/.cache/finch
- Tests: 58, all clean under valgrind (MEMCHECK=1 tests/run.sh)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:57:37 +02:00

25 lines
1.2 KiB
C

#include <stdint.h>
typedef struct { float x, y; } Vec2; // SSE: <2 x float>
typedef struct { float x, y, z; } Vec3; // SSE, SSE (float tail)
typedef struct { uint8_t r, g, b, a; } Color; // INTEGER: i32
typedef struct { double d; int i; } Mixed; // SSE + INTEGER
typedef struct { int64_t a, b; } Pair; // INTEGER, INTEGER
typedef struct { int64_t a, b, c; } Big; // MEMORY (24 bytes)
typedef struct { char name[8]; int count; } Named; // fixed array inside
typedef struct { Vec2 pos; Color color; } Sprite; // nested
typedef struct Item { int value; struct Item *next; } Item;
Vec2 vec2_add(Vec2 a, Vec2 b);
Vec3 vec3_scale(Vec3 v, float k);
Color color_invert(Color c);
Mixed mixed_bump(Mixed m);
Pair pair_swap(Pair p);
Big big_sum(Big a, Big b);
int64_t big_total(Big b);
int named_len(Named n);
Sprite sprite_move(Sprite s, float dx);
int item_sum(Item *it);
// many structs: runs out of registers, later ones go on the stack
double many(Vec2 a, Vec2 b, Vec2 c, Vec2 d, Vec2 e, Vec2 f, Vec2 g, Vec2 h, Vec2 i, Pair p1, Pair p2, Pair p3, Pair p4);
int64_t apply_pair(Pair (*fn)(Pair, int64_t), Pair p, int64_t k);
float apply_vec(Vec2 (*fn)(Vec2), Vec2 v);