Finch/tests/shared/host.c
Nexoniarz dd9cbe7611 export fn and finch build --shared, in the compiler written in Finch; FINCH_PATH, FINCH_RT, FINCH_CC
export fn name(...) is a C function of a library; build --shared makes lib<name>.so with no main and a
finch_module_on_fatal(handler) the host can take runtime errors over with. Ported from the embed work (the
runtime, its test and the docs are that work's; the compiler side is new).

The driver reads FINCH_PATH (more module folders), FINCH_RT (the runtime's file) and FINCH_CC (the clang).
tests/boot.sh also runs tests/shared.sh with the compiler under test. 41 passed.
2026-10-25 21:03:05 +01:00

17 lines
828 B
C

#include <dlfcn.h>
#include <setjmp.h>
#include <stdio.h>
static jmp_buf jb;
void host_print(const char *s) { printf("host_print: %s\n", s); }
static void onFatal(const char *m) { printf("caught: %s\n", m); longjmp(jb, 1); }
int main(int argc, char **argv) {
void *h = dlopen(argc > 1 ? argv[1] : "./libmod.so", RTLD_NOW | RTLD_LOCAL);
if (!h) { printf("%s\n", dlerror()); return 1; }
((void (*)(void (*)(const char *)))dlsym(h, "finch_module_on_fatal"))(onFatal);
printf("add %ld\n", ((long (*)(long, long))dlsym(h, "add"))(2, 40));
printf("even %d %d\n", ((_Bool (*)(long))dlsym(h, "is_even"))(4), ((_Bool (*)(long))dlsym(h, "is_even"))(5));
((void (*)(const char *))dlsym(h, "hello"))("Rakya");
if (!setjmp(jb)) ((long (*)(long))dlsym(h, "crash"))(7);
printf("still alive\n");
return 0;
}