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