From 5a13b49ee698d07513c7ec71332bc9aa9b8b6ad9 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 16 Feb 2024 04:16:37 +0200 Subject: [PATCH] FFI: properly error on read of *a:b --- src/ffi.c | 6 ++++-- test/cases/ffi.bqn | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ffi.c b/src/ffi.c index 7c8caf38..1585f394 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -820,8 +820,10 @@ static u8 const reTyMapC[] = { [3]=t_c8arr, [4]=t_c16arr, [5]=t_c32arr }; static u8 const reTyMapI[] = { [3]=t_i8arr, [4]=t_i16arr, [5]=t_i32arr, [6]=t_f64arr, [0]=t_bitarr }; static B readRe(BQNFFIType* t, u8* src) { B e = t->a[0].o; - assert(isC32(e) || e.u==ty_voidptr.u); - u8 elW = isC32(e)? sty_w[styG(e)] : sizeof(void*); // bytes + u8 elW; // bytes + if (isC32(e)) elW = sty_w[styG(e)]; + else if (e.u==ty_voidptr.u) elW = sizeof(void*); + else thrF("FFI: Cannot read from %R", ty_fmt(tag(t, OBJ_TAG))); u8 reW = t->reWidth; // log bits B r; char* dst = m_tyarrlbv(&r, reW, (elW*8)>>reW, (t->reType=='c'? reTyMapC : reTyMapI)[reW]); diff --git a/test/cases/ffi.bqn b/test/cases/ffi.bqn index 630d26e4..abf54de0 100644 --- a/test/cases/ffi.bqn +++ b/test/cases/ffi.bqn @@ -196,6 +196,7 @@ !"Cannot get a field of a pointer to a scalar" % %USE WallocE {{𝕊al: ("i32" Al 99).Field 0}} !"ptr.Write: Cannot write array to ""*i32""" % %USE WallocE {{𝕊al: ("*i32" Al 99).Write 1‿2‿3}} !"ptr.Write: Cannot write array to ""*i32:i32""" % %USE WallocE {{𝕊al: ("*i32:i32"Al 99).Write ↕16}} +!"FFI: Cannot read from ""*i32:i32""" % %USE WallocE {{𝕊al: ("*i32:i32"Al 99).Read 0}} %USE Walloc {{𝕊al: p←("" Al 99).Cast "*:i8" ⋄ a←"i32"Al 99 ⋄ a.Write 12345 ⋄ p.Write ar←Cpy a‿a‿0 ⋄ ! ar ≡ p.Read 0 ⋄ a.Read 0}} %% 12345 %USE Walloc {{𝕊al: p←"i16" Al 99 ⋄ raw ← Cpy 0∾˜⋈˜p.Add 3 ⋄ cpy2←@•FFI"*i16"‿"memcpy"‿"*:i8"‿"*:i8"‿size_t ⋄ p.Sub Cpy2 raw‿raw‿0 }} %% ¯3