ref: b42fcc3ec951c1b3db0760f25ea5d9eb0b518659
parent: 05e66c8ffeea8c0b02d49acca753f44b65e4ad32
author: spew <spew@cbza.org>
date: Tue Apr 8 08:15:20 EDT 2025
unboxed constructors should return unboxed values where possible Fixes: https://todo.sr.ht/~ft/sl/57
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -273,14 +273,14 @@
}else \
argcount(nargs, 1); \
sl_v v; \
+ ctype n; \
+ cvalue_##ctype##_init(sl_##typenam##type, args[0], &n); \
if(tag < T_UNBOXED_NUM && \
- sizeof(ctype) < sizeof(sl_v)){ \
- ctype u; \
- cvalue_##ctype##_init(sl_##typenam##type, args[0], &u); \
- v = (sl_v)u<<TAG_EXT_BITS | tag<<4 | TAG_UNBOXED; \
+ (sizeof(n) < sizeof(sl_v) || fits_bits(n, UNBOXED_BITS-1))){ \
+ v = (sl_v)n<<TAG_EXT_BITS | tag<<4 | TAG_UNBOXED; \
}else{ \
- v = cvalue(sl_##typenam##type, sizeof(ctype)); \
- cvalue_##ctype##_init(sl_##typenam##type, args[0], cvalue_data(v)); \
+ v = cvalue(sl_##typenam##type, sizeof(n)); \
+ *(ctype*)cvalue_data(v) = n; \
} \
return v; \
}