shithub: sl

Download patch

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);
--