diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-02-07 20:31:10 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-02-07 20:31:10 -0800 |
commit | b4bfaec54640ef51accbd4e2470951036bf6cbe8 (patch) | |
tree | a5626d394462a7c99d1856502f073baa93b37f60 /ffi.c | |
parent | 379c61ad042cd5c10f3efbafe6425b5e8cc9347b (diff) | |
download | txr-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.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -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); |