diff options
-rw-r--r-- | ffi.c | 7 | ||||
-rw-r--r-- | tests/017/flexstruct.tl | 9 |
2 files changed, 12 insertions, 4 deletions
@@ -2443,9 +2443,8 @@ static void ffi_ptr_in_release(struct txr_ffi_type *tft, val obj, *loc = 0; } -static val ffi_flex_struct_in(struct txr_ffi_type *tft, val strct, val self) +static val ffi_flex_array_len(struct smemb *lastm, val strct, val self) { - struct smemb *lastm = &tft->memb[tft->nelem - 1]; struct txr_ffi_type *lmtft = lastm->mtft; (void) self; @@ -2499,7 +2498,7 @@ static val ffi_struct_in(struct txr_ffi_type *tft, int copy, mem_t *src, ucnum offs = memb[i].offs; if (slsym) { if (flexp && copy && i == nmemb - 1) - ffi_flex_struct_in(tft, strct, self); + ffi_flex_array_len(&memb[i], strct, self); if (mtft->in != 0) { val slval = slot(strct, slsym); slotset(strct, slsym, mtft->in(mtft, copy, src + offs, slval, self)); @@ -2566,7 +2565,7 @@ static val ffi_struct_get(struct txr_ffi_type *tft, mem_t *src, val self) ucnum offs = memb[i].offs; if (slsym) { if (flexp && i == nmemb - 1) { - val slval = ffi_flex_struct_in(tft, strct, self); + val slval = ffi_flex_array_len(&memb[i], strct, self); if (mtft->in != 0) slotset(strct, slsym, mtft->in(mtft, 1, src + offs, slval, self)); } else { diff --git a/tests/017/flexstruct.tl b/tests/017/flexstruct.tl index c8feedef..8f91096e 100644 --- a/tests/017/flexstruct.tl +++ b/tests/017/flexstruct.tl @@ -62,3 +62,12 @@ (mtest (ffi-get #b'0300010002000300' (ffi fs3)) #S(fs3 a 3 b #(1 2 3))) + +(typedef fs4 (struct fs4 + (c int8) + (s fs0))) + +(mtest + (sizeof fs4) 2 + (ffi-put #S(fs4 c 93 s #S(fs0 a 4 b "ABCD")) (ffi fs4)) #b'5d0441424344' + (ffi-get #b'5d0441424344' (ffi fs4)) #S(fs4 c 93 s #S(fs0 a 4 b "ABCD"))) |