shithub: sl

Download patch

ref: 6f3899bca697d26c7986c8c7f3b49baa4b5aff89
parent: d5715fb848737d39f465381c60ddc2a81b8b34c5
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Apr 1 21:27:44 EDT 2025

cvalues: mk_*: try to fit an unboxed version regardless of the underlying type size

References: https://todo.sr.ht/~ft/sl/46

--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -206,23 +206,19 @@
 	{ \
 		ctype n; \
 		USED(type); \
-		if(isfixnum(a)) \
+		if(isfixnum(a)){ \
 			n = (ctype)numval(a); \
-		else if(isunboxednum(a)){ \
-			uintptr v; \
-			void *p = &v; \
-			if(isunboxedunum(a)) \
-				v = unboxednumuval(a); \
-			else \
-				v = unboxednumsval(a); \
-			n = (ctype)conv_to_##cnvt(p, unboxednumtype(a)); \
+		}else if(isunboxedunum(a)){ \
+			uintptr v = unboxednumuval(a); \
+			n = (ctype)conv_to_##cnvt(&v, unboxednumtype(a)); \
+		}else if(isunboxedsnum(a)){ \
+			intptr v = unboxednumsval(a); \
+			n = (ctype)conv_to_##cnvt(&v, unboxednumtype(a)); \
 		}else if(iscprim(a)){ \
 			sl_cprim *cp = ptr(a); \
-			void *p = cp_data(cp); \
-			n = (ctype)conv_to_##cnvt(p, cp_numtype(cp)); \
+			n = (ctype)conv_to_##cnvt(cp_data(cp), cp_numtype(cp)); \
 		}else if(ismp(a)){ \
-			void *p = cv_data(ptr(a)); \
-			n = (ctype)conv_to_##cnvt(p, T_MP); \
+			n = (ctype)conv_to_##cnvt(cv_data(ptr(a)), T_MP); \
 		}else \
 			type_error("num", a); \
 		*((ctype*)dest) = n; \
@@ -261,14 +257,12 @@
 			args = sl.sp-1; \
 		} \
 		sl_v v; \
-		if(tag < T_UNBOXED_NUM && sizeof(ctype) < sizeof(sl_v) && sl_##typenam##type != sl_runetype){ \
+		if(tag < T_UNBOXED_NUM && \
+		   sl_##typenam##type != sl_runetype && \
+		   sizeof(ctype) < sizeof(sl_v)){ \
 			ctype u; \
 			cvalue_##ctype##_init(sl_##typenam##type, args[0], &u); \
-			if(tag & 1) \
-				v = (uintptr)u; \
-			else \
-				v = (intptr)u; \
-			v = v<<8 | tag<<4 | TAG_UNBOXED; \
+			v = (sl_v)u<<8 | tag<<4 | TAG_UNBOXED; \
 		}else{ \
 			v = cprim(sl_##typenam##type, sizeof(ctype)); \
 			cvalue_##ctype##_init(sl_##typenam##type, args[0], cp_data(ptr(v))); \
@@ -277,7 +271,8 @@
 	}
 
 #define num_ctor_ctor(typenam, ctype, tag) \
-	sl_v mk_##typenam(ctype n) \
+	sl_v \
+	mk_##typenam(ctype n) \
 	{ \
 		sl_v v = cprim(sl_##typenam##type, sizeof(n)); \
 		*(ctype*)cp_data(ptr(v)) = n; \
@@ -284,11 +279,16 @@
 		return v; \
 	}
 
+#define UNBOXED_NUM_BITS (FIXNUM_BITS+TAG_BITS-8)
+
 #define num_ctor_ctor_unboxed(typenam, ctype, tag) \
-	sl_v mk_##typenam(ctype n) \
+	sl_v \
+	mk_##typenam(ctype n) \
 	{ \
 		sl_v v; \
-		if(tag < T_UNBOXED_NUM && sizeof(n) < sizeof(sl_v) && sl_##typenam##type != sl_runetype){ \
+		if(tag < T_UNBOXED_NUM && \
+		   sl_##typenam##type != sl_runetype && \
+		   (sizeof(n) < sizeof(sl_v) || fits_bits(n, UNBOXED_NUM_BITS))){ \
 			v = n<<8 | tag<<4 | TAG_UNBOXED; \
 		}else{ \
 			v = cprim(sl_##typenam##type, sizeof(n)); \