From c08a749043bffa9c9e6561733ee550c15ce87c06 Mon Sep 17 00:00:00 2001 From: agra Date: Tue, 19 May 2026 11:51:34 +0300 Subject: [PATCH] ffi 0.7: #import c { #include / #source } via stdlib-path resolution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 94/94 regression tests pass (+ffi-07-c-import-block). Companion C helper lives only at `library/vendors/sx_ffi_resolve_test/`. Critically NOT in `sx/vendors/` (the sx repo root) and NOT in the importing example's directory — so the `vendors/...` paths in this example are findable solely via the stdlib search branch (`/../../library`, `/../library`, `/library`). That branch is the one the JNI insets bridge needs to reach `library/vendors/sx_android_jni/sx_android_jni.c` without forcing chess (or any consumer) to vendor an identically-named copy. The test pins the resolution end-to-end: - #include resolves; clang parses the .h; c_import.zig synthesizes #foreign fn decls for `sx_ffi_resolve_test_add` / `_mul`. - #source resolves; the .c is compiled into the build's object list. - sx calls the synthesized decls and prints results. --- examples/ffi-07-c-import-block.sx | 25 +++++++++++++++++++ .../sx_ffi_resolve_test/sx_ffi_resolve_test.c | 4 +++ .../sx_ffi_resolve_test/sx_ffi_resolve_test.h | 7 ++++++ tests/expected/ffi-07-c-import-block.exit | 1 + tests/expected/ffi-07-c-import-block.txt | 2 ++ 5 files changed, 39 insertions(+) create mode 100644 examples/ffi-07-c-import-block.sx create mode 100644 library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.c create mode 100644 library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.h create mode 100644 tests/expected/ffi-07-c-import-block.exit create mode 100644 tests/expected/ffi-07-c-import-block.txt diff --git a/examples/ffi-07-c-import-block.sx b/examples/ffi-07-c-import-block.sx new file mode 100644 index 0000000..eeb6643 --- /dev/null +++ b/examples/ffi-07-c-import-block.sx @@ -0,0 +1,25 @@ +// Phase 0 baseline (PLAN-FFI.md step 0.7): `#import c { #include / +// #source }` end-to-end, with the new stdlib-path resolution +// (src/imports.zig added this session). The header + .c live ONLY +// under `library/vendors/sx_ffi_resolve_test/` — not the sx repo +// root vendors/ — so the path can be found only by the stdlib +// search branch (`/../../library` etc.), not by the CWD or +// importing-file's-dir branches. +// +// `#include` triggers c_import.zig's auto-synthesis of `#foreign` +// fn decls from the C header; `#source` adds the .c to the build's +// object list. Together they let the sx side call the C functions +// by their declared names with no manual decls. + +#import "modules/std.sx"; + +#import c { + #include "vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.h"; + #source "vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.c"; +}; + +main :: () -> s32 { + print("add(3, 4) = {}\n", sx_ffi_resolve_test_add(3, 4)); + print("mul(6, 7) = {}\n", sx_ffi_resolve_test_mul(6, 7)); + 0; +} diff --git a/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.c b/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.c new file mode 100644 index 0000000..12d2fc5 --- /dev/null +++ b/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.c @@ -0,0 +1,4 @@ +#include "sx_ffi_resolve_test.h" + +int sx_ffi_resolve_test_add(int a, int b) { return a + b; } +int sx_ffi_resolve_test_mul(int a, int b) { return a * b; } diff --git a/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.h b/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.h new file mode 100644 index 0000000..b601a71 --- /dev/null +++ b/library/vendors/sx_ffi_resolve_test/sx_ffi_resolve_test.h @@ -0,0 +1,7 @@ +// Lives in library/vendors/ (NOT alongside the sx repo root vendors/), +// so the only way the build can find this from `vendors/...` is via +// imports.zig's stdlib-path resolution chain. Used as a regression net +// for that resolution branch — see examples/ffi-07-c-import-block.sx. + +int sx_ffi_resolve_test_add(int a, int b); +int sx_ffi_resolve_test_mul(int a, int b); diff --git a/tests/expected/ffi-07-c-import-block.exit b/tests/expected/ffi-07-c-import-block.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/ffi-07-c-import-block.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/ffi-07-c-import-block.txt b/tests/expected/ffi-07-c-import-block.txt new file mode 100644 index 0000000..ab26723 --- /dev/null +++ b/tests/expected/ffi-07-c-import-block.txt @@ -0,0 +1,2 @@ +add(3, 4) = 7 +mul(6, 7) = 42