shithub: sl

Download patch

ref: 70c36896d20df1971a65a800acbe3872157a7910
parent: f88e3f0d32f64dee4cf62910427939f45b66e7e2
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Mar 24 18:08:52 EDT 2025

ash: shift negative fixnums as is

--- a/3rd/mp/mpright.c
+++ b/3rd/mp/mpright.c
@@ -28,7 +28,7 @@
 	d = shift/Dbits;
 	r = shift - d*Dbits;
 	l = Dbits - r;
-
+fprintf(stderr, "%u %u %u\n", d, r, l);
 	//  shift all the bits out == zero
 	if(d>=b->top){
 		res->sign = 1;
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -1256,11 +1256,13 @@
 	argcount(nargs, 2);
 	sl_v a = args[0];
 	n = tofixnum(args[1]);
+	if(n == 0)
+		return a;
 	mp = nil;
 	if(isfixnum(a)){
 		accum = numval(a);
-		if(accum >= 0 && n > -64 && n <= 0)
-			return fixnum(numval(a)>>(-n));
+		if(n > -64 && n < 0)
+			return fixnum(accum>>(-n));
 		if(n < 0 || n >= 64 || sash_overflow_64(accum, n, &accum)){
 			mp = vtomp(accum, nil);
 			mpleft(mp, n, mp);
@@ -1268,8 +1270,6 @@
 			return fits_fixnum(accum) ? fixnum(accum) : return_from_s64(accum);
 	}
 	if(iscprim(a)){
-		if(n == 0)
-			return a;
 		cp = ptr(a);
 		ta = cp_numtype(cp);
 		aptr = cp_data(cp);
@@ -1290,8 +1290,6 @@
 		else if(ta < T_FLOAT)
 			return return_from_s64(conv_to_s64(aptr, ta)<<n);
 	}else if(ismp(a)){
-		if(n == 0)
-			return a;
 		aptr = cv_data(ptr(a));
 		mp = mpnew(0);
 		mpleft(*(mpint**)aptr, n, mp);
--