ref: 53a11dd7268c0d550a332e1ba939813d378cd24e
parent: 234b1e0940c317c87216f977e3ec2d860223292f
author: spew <spew@cbza.org>
date: Tue Apr 8 11:16:46 EDT 2025
fix overflow arithmetic for unboxed types
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -277,7 +277,7 @@
cvalue_##ctype##_init(sl_##typenam##type, args[0], &n); \
if(tag < T_UNBOXED_NUM && \
(sizeof(n) < sizeof(sl_v) || fits_bits(n, UNBOXED_BITS-1))){ \
- v = (sl_v)n<<TAG_EXT_BITS | tag<<4 | TAG_UNBOXED; \
+ v = (sl_v)n<<TAG_EXT_BITS | tag<<TAG_UBNUM_SHIFT | TAG_UNBOXED; \
}else{ \
v = cvalue(sl_##typenam##type, sizeof(n)); \
*(ctype*)cvalue_data(v) = n; \
@@ -302,7 +302,7 @@
sl_v v; \
if(tag < T_UNBOXED_NUM && \
(sizeof(n) < sizeof(sl_v) || fits_bits(n, UNBOXED_BITS-1))){ \
- v = (sl_v)n<<TAG_EXT_BITS | tag<<4 | TAG_UNBOXED; \
+ v = (sl_v)n<<TAG_EXT_BITS | tag<<TAG_UBNUM_SHIFT | TAG_UNBOXED; \
}else{ \
v = cvalue(sl_##typenam##type, sizeof(n)); \
*(ctype*)cvalue_data(v) = n; \
--- a/src/sl_arith_any.h
+++ b/src/sl_arith_any.h
@@ -101,7 +101,11 @@
MP_OP(Maccum, m, Maccum);
continue;
}
- if(iscvalue(arg)){
+ if(isubnum(arg)){
+ u64 = ubnumval(arg);
+ a = &u64;
+ pt = ubnumtype(arg);
+ }else if(iscvalue(arg)){
cv = ptr(arg);
a = cv_data(cv);
pt = cv_numtype(cv);
--
⑨