From cfaae47cea395279de9ce1d986ef3432533695b5 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 19 Jun 2022 13:02:26 -0500 Subject: [PATCH] Fix trailing :pack-all or :pack in struct. --- src/core/ffi.c | 1 + src/core/specials.c | 4 ++-- test/suite0012.janet | 17 ++++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core/ffi.c b/src/core/ffi.c index d6a7c879..24de85cd 100644 --- a/src/core/ffi.c +++ b/src/core/ffi.c @@ -346,6 +346,7 @@ static JanetFFIStruct *build_struct_type(int32_t argc, const Janet *argv) { if (janet_keyeq(argv[j], "pack") || janet_keyeq(argv[j], "pack-all")) { pack_one = 1; j++; + if (j == argc) break; } st->fields[i].type = decode_ffi_type(argv[j]); size_t el_size = type_size(st->fields[i].type); diff --git a/src/core/specials.c b/src/core/specials.c index 592fd1a1..c608f8ab 100644 --- a/src/core/specials.c +++ b/src/core/specials.c @@ -303,8 +303,8 @@ static JanetTable *handleattr(JanetCompiler *c, int32_t argn, const Janet *argv) int32_t i; JanetTable *tab = janet_table(2); const char *binding_name = janet_type(argv[0]) == JANET_SYMBOL - ? ((const char *)janet_unwrap_symbol(argv[0])) - : ""; + ? ((const char *)janet_unwrap_symbol(argv[0])) + : ""; for (i = 1; i < argn - 1; i++) { Janet attr = argv[i]; switch (janet_type(attr)) { diff --git a/test/suite0012.janet b/test/suite0012.janet index 00afb19b..86b43eec 100644 --- a/test/suite0012.janet +++ b/test/suite0012.janet @@ -28,16 +28,27 @@ (assert (= (thunk) 1) "delay 3") (assert (= counter 1) "delay 4") +(def has-ffi (dyn 'ffi/native)) + # FFI check -(compwhen (dyn 'ffi/native) +(compwhen has-ffi (ffi/context)) -(compwhen (dyn 'ffi/native) +(compwhen has-ffi (ffi/defbind memcpy :ptr [dest :ptr src :ptr n :size])) -(compwhen (dyn 'ffi/native) +(compwhen has-ffi (def buffer1 @"aaaa") (def buffer2 @"bbbb") (memcpy buffer1 buffer2 4) (assert (= (string buffer1) "bbbb") "ffi 1 - memcpy")) +(compwhen has-ffi + (assert (= 8 (ffi/size [:int :char])) "size unpacked struct 1") + (assert (= 5 (ffi/size [:pack :int :char])) "size packed struct 1") + (assert (= 5 (ffi/size [:int :pack-all :char])) "size packed struct 2") + (assert (= 4 (ffi/align [:int :char])) "align 1") + (assert (= 1 (ffi/align [:pack :int :char])) "align 2") + (assert (= 1 (ffi/align [:int :char :pack-all])) "align 3") + (assert (= 26 (ffi/size [:char :pack :int @[:char 21]])) "array struct size")) + (end-suite)