// Phase 0 baseline (PLAN-FFI.md step 0.1): every primitive type passed // in/out of a C `#foreign` fn via `#import c { #include / #source }`. // Locks today's parameter + return ABI so Phase 1's lowering changes // (`#objc_call` / `#jni_call`) can't silently regress us. // // Note: c_import maps `signed char` to sx `u8` (see c_import.zig:541) // — narrow signed-char roundtrips are still surfaced here so any future // mapping change shows up as a snapshot diff. #import "modules/std.sx"; #import c { #include "1209-ffi-01-primitives.h"; #source "1209-ffi-01-primitives.c"; }; main :: () -> i32 { // Signed roundtrips print("ffi_id_int(-42) = {}\n", ffi_id_int(0 - 42)); print("ffi_id_short(-1234) = {}\n", ffi_id_short(0 - 1234)); print("ffi_id_i64(huge) = {}\n", ffi_id_i64(9000000000000000000)); // Unsigned roundtrips print("ffi_id_uint(0xDEADBEEF) = {}\n", ffi_id_uint(0xDEADBEEF)); print("ffi_id_ushort(0xFFFF) = {}\n", ffi_id_ushort(0xFFFF)); print("ffi_id_u64(0x7FEE...) = {}\n", ffi_id_u64(0x7FEEDFACECAFEBEE)); // Narrow char roundtrips (both map to u8 in current sx) print("ffi_id_schar(127) = {}\n", ffi_id_schar(127)); print("ffi_id_uchar(255) = {}\n", ffi_id_uchar(255)); // Floating point print("ffi_id_f32(3.5) = {}\n", ffi_id_f32(3.5)); print("ffi_id_f64(1.5) = {}\n", ffi_id_f64(1.5)); // Pointer roundtrip — proves *void survives the boundary sentinel : i32 = 42; p_in : *void = xx @sentinel; p_out := ffi_id_ptr(p_in); addr_in : u64 = xx p_in; addr_out : u64 = xx p_out; print("ffi_id_ptr roundtrip = {}\n", addr_in == addr_out); // Arithmetic helpers — exercise multi-arg ABI print("ffi_add_int(7, 8) = {}\n", ffi_add_int(7, 8)); print("ffi_add_double(0.25, 0.75) = {}\n", ffi_add_double(0.25, 0.75)); 0 }