diff --git a/examples/ffi/so.c b/examples/ffi/so.c index 86417aa4..f2934827 100644 --- a/examples/ffi/so.c +++ b/examples/ffi/so.c @@ -124,7 +124,8 @@ void void_fn(void) { printf("void fn ran\n"); } -EXPORTER void_fn_2(double y) { +EXPORTER +void void_fn_2(double y) { printf("y = %f\n", y); } @@ -132,3 +133,13 @@ EXPORTER void void_ret_fn(int x) { printf("void fn ran: %d\n", x); } + +typedef struct { + int a, b; + float c, d; +} Split; + +EXPORTER +float split_fn(Split s) { + return s.a * s.c + s.b * s.d; +} diff --git a/examples/ffi/test.janet b/examples/ffi/test.janet index ff586791..ded10aff 100644 --- a/examples/ffi/test.janet +++ b/examples/ffi/test.janet @@ -45,6 +45,8 @@ j :double]) (ffi/defbind void-fn-2 :void [y :double]) +(def split (ffi/struct :int :int :float :float)) +(ffi/defbind split-fn :float [s split]) # # Struct reading and writing # @@ -85,6 +87,7 @@ # Call functions # +(tracev (split-fn [5 6 1.2 3.4])) (tracev (void-fn-2 10.3)) (tracev (double-many 1 2 3 4 5 6)) (tracev (string/format "%.17g" (double-many 1 2 3 4 5 6))) diff --git a/src/core/corelib.c b/src/core/corelib.c index dcde0c45..af86d9d0 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -614,27 +614,22 @@ JANET_CORE_FN(janet_core_signal, "(signal what x)", "Raise a signal with payload x. ") { janet_arity(argc, 1, 2); - int sig; + Janet payload = argc == 2 ? argv[1] : janet_wrap_nil(); if (janet_checkint(argv[0])) { int32_t s = janet_unwrap_integer(argv[0]); if (s < 0 || s > 9) { janet_panicf("expected user signal between 0 and 9, got %d", s); } - sig = JANET_SIGNAL_USER0 + s; + janet_signalv(JANET_SIGNAL_USER0 + s, payload); } else { JanetKeyword kw = janet_getkeyword(argv, 0); - if (!janet_cstrcmp(kw, "yield")) { - sig = JANET_SIGNAL_YIELD; - } else if (!janet_cstrcmp(kw, "error")) { - sig = JANET_SIGNAL_ERROR; - } else if (!janet_cstrcmp(kw, "debug")) { - sig = JANET_SIGNAL_DEBUG; - } else { - janet_panicf("unknown signal, expected :yield, :error, or :debug, got %v", argv[0]); + for (unsigned i = 0; i < sizeof(janet_signal_names) / sizeof(char *); i++) { + if (!janet_cstrcmp(kw, janet_signal_names[i])) { + janet_signalv((JanetSignal) i, payload); + } } } - Janet payload = argc == 2 ? argv[1] : janet_wrap_nil(); - janet_signalv(sig, payload); + janet_panicf("unknown signal %v", argv[0]); } #ifdef JANET_BOOTSTRAP