summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-02-07 20:31:10 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-02-07 20:31:10 -0800
commitb4bfaec54640ef51accbd4e2470951036bf6cbe8 (patch)
treea5626d394462a7c99d1856502f073baa93b37f60 /ffi.c
parent379c61ad042cd5c10f3efbafe6425b5e8cc9347b (diff)
downloadtxr-b4bfaec54640ef51accbd4e2470951036bf6cbe8.tar.gz
txr-b4bfaec54640ef51accbd4e2470951036bf6cbe8.tar.bz2
txr-b4bfaec54640ef51accbd4e2470951036bf6cbe8.zip
ffi: use padded return size in closure dispatch.
* ffi.c (ffi_closure_dispatch_safe): When initially clearing a return value that has release semantics, use the padded size, not the nominal size. Let's get calculate this once and put it in a local.
Diffstat (limited to 'ffi.c')
-rw-r--r--ffi.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/ffi.c b/ffi.c
index d9db41f8..e0f662b3 100644
--- a/ffi.c
+++ b/ffi.c
@@ -4173,10 +4173,11 @@ static void ffi_closure_dispatch_safe(ffi_cif *cif, void *cret,
struct txr_ffi_type *rtft = ffi_type_struct(rtype);
volatile val retval = nao;
int out_pass_needed = 0;
+ size_t rsize = pad_retval(rtft->size);
uw_frame_t cont_guard;
if (rtft->release != 0)
- memset(cret, 0, rtft->size);
+ memset(cret, 0, rsize);
uw_push_guard(&cont_guard, 0);
@@ -4218,7 +4219,7 @@ static void ffi_closure_dispatch_safe(ffi_cif *cif, void *cret,
if (rtft->release != 0 && retval != nao)
rtft->release(rtft, retval, convert(mem_t *, cret));
if (!tfcl->abort_retval)
- memset(cret, 0, pad_retval(rtft->size));
+ memset(cret, 0, rsize);
else
ifbe2(rtft->rput, rtft->put)(rtft, tfcl->abort_retval,
convert(mem_t *, cret), self);