summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-29 18:25:28 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-29 18:25:28 -0700
commit1b891820b5b1e4ed35b87b3c0a040fd289e95801 (patch)
tree2d033ab5be6289433948bc88794f836f05fdbb98
parente257904f353d7cd9bd9119f089cd1ca47c73d6c7 (diff)
downloadtxr-1b891820b5b1e4ed35b87b3c0a040fd289e95801.tar.gz
txr-1b891820b5b1e4ed35b87b3c0a040fd289e95801.tar.bz2
txr-1b891820b5b1e4ed35b87b3c0a040fd289e95801.zip
ffi: pad retval to ffi_arg size on all platforms.
* ffi.c (pad_retval): Define same way regardless of big or little endian. For instance, we don't want to call alloca(1) for a char return value. It could be the case on little endian targets that libffi prepares an entire ffi_arg return value. Even though we just read the low order byte, we still have to prepare enough space for the whole thing.
-rw-r--r--ffi.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/ffi.c b/ffi.c
index e6d22814..55f58c01 100644
--- a/ffi.c
+++ b/ffi.c
@@ -62,18 +62,19 @@
#define alignof(type) offsetof(struct {char x; type y;}, y)
+#define pad_retval(size) ((size) > sizeof (ffi_arg) \
+ ? (size) \
+ : sizeof (ffi_arg))
+
#if HAVE_LITTLE_ENDIAN
-#define pad_retval(size) (size)
#define ifbe(expr) (0)
#define ifbe2(expr1, expr2) (expr2)
#else
-#define pad_retval(size) ((size) > sizeof (ffi_arg) \
- ? (size) \
- : sizeof (ffi_arg))
#define ifbe(expr) (expr)
#define ifbe2(expr1, expr2) (expr1)
#endif
+
val uint8_s, int8_s;
val uint16_s, int16_s;
val uint32_s, int32_s;