shithub: sl

Download patch

ref: 2f759f8bda41a259714cd8a181811c8cebd4714c
parent: b32dfcdaf4b346ac644538eaa62dd48bc24398af
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Apr 28 23:06:35 EDT 2025

more tests; fix lognot for unboxed C integers

--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -1345,16 +1345,23 @@
 {
 	argcount(nargs, 1);
 	sl_v a = args[0];
-	void *aptr;
 
 	if(isfixnum(a))
 		return fixnum(~numval(a));
-	if(isubnum(a))
-		return (~ubnumval(a) & ~0xff) | (a & 0xff);
+	if(isubnum(a)){
+		if((ubnumtype(a) & 1) == 0){
+			sl_fx s = ubnumval(a);
+			s = ~s << TAG_EXT_BITS;
+			return ((sl_v)s & ~(sl_v)TAG_EXT_MASK) | (a & TAG_EXT_MASK);
+		}
+		sl_v u = ubnumval(a);
+		u = ~u << TAG_EXT_BITS;
+		return (u & ~(sl_v)TAG_EXT_MASK) | (a & TAG_EXT_MASK);
+	}
 	if(iscvalue(a)){
 		sl_cv *cv = ptr(a);
 		sl_numtype ta = cv_numtype(cv);
-		aptr = cv_data(cv);
+		void *aptr = cv_data(cv);
 		switch(ta){
 		case T_S32: return mk_s32(~*(s32int*)aptr);
 		case T_U32: return mk_u32(~*(u32int*)aptr);
--- a/src/sl.h
+++ b/src/sl.h
@@ -22,6 +22,7 @@
 
 	TAG_BITS = 3,
 	TAG_EXT_BITS = 8,
+	TAG_EXT_MASK = (1<<TAG_EXT_BITS)-1,
 
 	/* those were set to 7 and 3 strategically on purpose */
 	TAG_NONLEAF_MASK = TAG_CONS & TAG_VEC,
--- a/test/unittest.sl
+++ b/test/unittest.sl
@@ -111,6 +111,25 @@
 (assert (= 3203431780337 (div 576460752303423487 179951)))
 (assert (= 3487 (mod 576460752303423487 18000)))
 (assert (= 7 (mod 576460752303423487 10)))
+(assert-fail (mod 1 0))
+(assert-fail (div 1 0))
+(assert-fail (div0 1 0))
+(assert-fail (/ 1 0))
+
+(assert (= 15 (logior 1 2 4 8)))
+(assert (= -1 (logior 3 -1)))
+(assert (= 0 (logand 1 2)))
+(assert (= 12328 (logand 14826 12345)))
+(assert (= 3 (logand 3 -1)))
+(assert (= 2515 (logxor 14826 12345)))
+(assert (= -4 (logxor 3 -1)))
+(assert (= 0 (logxor 0 0)))
+(assert (= -11 (lognot 10)))
+(assert (eq? (s8 -11) (lognot (s8 10))))
+(assert (= 10 (lognot -11)))
+(assert (eq? (s8 10) (lognot (s8 -11))))
+(assert (= #x0f (lognot (u8 #xf0))))
+(assert (= #xf0 (lognot (u8 #x0f))))
 
 (assert (= #xfffffffffffffffff (logior #xaaaaaaaaaaaaaaaaa #x55555555555555555)))
 (assert (= #xaaaaaaaaaaaaaaaaa (logxor #xfffffffffffffffff #x55555555555555555)))