shithub: sl

Download patch

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; \
 	}