summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-20 22:40:53 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-20 22:40:53 -0700
commit8f9697ed8f42681ab0df16ab38859d61ea05412e (patch)
tree10a7a50b5e7a0d26d11ddb5e3cf238f874e187ac /tests
parent378318ef010dfb15045dfadf242231793d1434de (diff)
downloadtxr-8f9697ed8f42681ab0df16ab38859d61ea05412e.tar.gz
txr-8f9697ed8f42681ab0df16ab38859d61ea05412e.tar.bz2
txr-8f9697ed8f42681ab0df16ab38859d61ea05412e.zip
ffi: testing and fixing flexible arrays.
* ffi.c (ffi_flex_struct_in): Check for the last member being an array, and not null-terminated. We now check the character conversion disposition of the array. If it has character conversion, then we store the length right into the slot that will become the string. In the no-conversion case, we assume that if the member exists, it's a vector we can resize. Otherwise we plant a vector of the required size. (ffi_varray_put): Only call ffi_varray_dynsize if the Lisp object is a vector. If the Lisp objecct is a number, then use that as the size. Otherwise the size is zero. * tests/017/flexstruct.tl: New file.
Diffstat (limited to 'tests')
-rw-r--r--tests/017/flexstruct.tl64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/017/flexstruct.tl b/tests/017/flexstruct.tl
new file mode 100644
index 00000000..c8feedef
--- /dev/null
+++ b/tests/017/flexstruct.tl
@@ -0,0 +1,64 @@
+(load "../common")
+
+(typedef fs0 (struct fs0
+ (a uint8)
+ (b (array char))))
+
+(mtest
+ (sizeof fs0) 1
+ (ffi-put #S(fs0 a 3 b "ABC") (ffi fs0)) #b'03414243'
+ (ffi-get #b'03414243' (ffi fs0)) #S(fs0 a 3 b ""))
+
+(defmeth fs0 length (s)
+ s.a)
+
+(mtest
+ (ffi-get #b'03414243' (ffi fs0)) #S(fs0 a 3 b "ABC")
+ (ffi-get #b'02e6bca2e5ad97' (ffi fs0)) #S(fs0 a 2 b "\xDCE6\xDCBC")
+ (ffi-get #b'06e6bca2e5ad97' (ffi fs0)) #S(fs0 a 6 b "漢字"))
+
+(typedef fs1 (struct fs1
+ (a uint8)
+ (b (zarray char))))
+
+(mtest
+ (sizeof fs1) 1
+ (ffi-put #S(fs1 a 3 b "ABCDEF") (ffi fs1)) #b'0341424344454600'
+ (ffi-get #b'FF41424300' (ffi fs1)) #S(fs1 a 255 b "ABC"))
+
+(mtest
+ (ffi-get #b'0341424300' (ffi fs1)) #S(fs1 a 3 b "ABC")
+ (ffi-get #b'02e6bc00' (ffi fs1)) #S(fs1 a 2 b "\xDCE6\xDCBC")
+ (ffi-get #b'06e6bca2e5ad9700' (ffi fs1)) #S(fs1 a 6 b "漢字"))
+
+(typedef fs2 (struct fs2
+ (a int8)
+ (b (array int8))))
+
+(mtest
+ (sizeof fs2) 1
+ (ffi-put #S(fs2 a 3 b "ABCD") (ffi fs2)) #b'0341424344'
+ (ffi-put #S(fs2 a 3 b #(65 66 67 68)) (ffi fs2)) #b'0341424344'
+ (ffi-get #b'FF414243' (ffi fs2)) #S(fs2 a 255 b #()))
+
+(defmeth fs2 length (s)
+ s.a)
+
+(mtest
+ (ffi-get #b'03010203' (ffi fs2)) #S(fs2 a 3 b #(1 2 3)))
+
+(typedef fs3 (struct fs3
+ (a int8)
+ (b (array le-int16))))
+
+(mtest
+ (sizeof fs3) 2
+ (ffi-put #S(fs3 a 3 b "ABCD") (ffi fs3)) #b'03004100420043004400'
+ (ffi-put #S(fs3 a 3 b #(65 66 67 68)) (ffi fs3)) #b'03004100420043004400'
+ (ffi-get #b'FF414243' (ffi fs3)) #S(fs3 a 255 b #()))
+
+(defmeth fs3 length (s)
+ s.a)
+
+(mtest
+ (ffi-get #b'0300010002000300' (ffi fs3)) #S(fs3 a 3 b #(1 2 3)))