shithub: sl

Download patch

ref: 7a9ca8d83215841cc5875516ac2499e9b4d076bb
parent: b936730b349a0acff61ed65b72f9f34fac4987cb
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Mar 27 03:29:05 EDT 2025

fixnum: 3 bits tag like everything else

This frees up one tag value for future use.

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

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -77,11 +77,12 @@
   #fn("n1707105122A<7302452515347560:" #(princ caddr ": " getprop *doc* newline))
   #fn(get) *properties* :kind princ newline *doc-extra* filter #fn("n10<20Q:" #(:doc-see)) "See also:"
   #fn("n1A<0=700=21522263:" #(getprop *formals-list* "    ")) "Members:" #fn("n1A<070021522263:" #(getprop
-  *formals-list* "    ")) void "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60q?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;J:042902:5283;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=528>3s08E3=02>8E<Pe1@30q8E3I07?8E<2<2@02A53e18?53@30q47?02B8>8H5252^1@30q42C2De12E8D2Fe22G8C2Fe22H2I2J8Fe2e22K2L2FEe32J0e2e3e32M2N2Fe2268F518@Me3e4e3e18E3X02E8E2C1e12C2Je12O8F5152e12O8A5153e3@30qe12O7P2Q8;8B8A8G8D8F0>78@525164:" #(#(NIL
-  NIL :named 1 :conc-name 3 :type 0 NIL NIL NIL NIL NIL NIL :predicate 4 NIL NIL NIL NIL NIL NIL
-  :constructor 2) vec #0# #fn("n17005121220A>28552485:" #(cddr #fn(for-each)
-                                                          #fn("n17002152340q:722324A<25F2605661:" #(member
-  (:read-only) error #fn(str) "invalid option in slot " " of struct " ": "))) slot-opts)
+  *formals-list* "    ")) void "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60q?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;J:042902:5283;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=528>3s08E3=02>8E<Pe1@30q8E3I07?8E<2<2@02A53e18?53@30q47?02B8>8H5252^1@30q42C2De12E8D2Fe22G8C2Fe22H2I2J8Fe2e22K2L2FEe32J0e2e3e32M2N2Fe2268F518@Me3e4e3e18E3X02E8E2C1e12C2Je12O8F5152e12O8A5153e3@30qe12O7P2Q8;8B8A8G8D8F0>78@525164:" #(#(:constructor
+  2 :predicate 4 NIL NIL :type 0 :named 1 :conc-name 3 NIL NIL) vec #0#
+  #fn("n17005121220A>28552485:" #(cddr #fn(for-each)
+                                  #fn("n17002152340q:722324A<25F2605661:" #(member (:read-only)
+                                                                            error #fn(str) "invalid option in slot "
+                                                                            " of struct " ": "))) slot-opts)
   #fn("n17021062:" #(map! #fn("n10B;35040<85;J404085;35040=;J604qe186RS;J9042086513=071228652@30q423242586522087<51390q87P@408762:" #(#fn(keyword?)
   error "invalid slot name: " #fn(list*) #fn(sym) #\:))) tokw) separate-doc-from-body #fn(length)
   #fn(map) #fn("n10B3500<:0:") #fn(sym) #\? "make-" #fn(str) "-" :doc-see sym-set-doc "Constructor for struct `"
@@ -259,11 +260,12 @@
             extend-env #fn("n370182E530P:" #(vars-to-env) extend-env) filter
             #fn("n2I20210>1?65148601qe163:" #(#0# #fn("n382I1B3Q04A1<513?0821<qPN=?2@30q41=?1@\x0e/4=:" #() filter-)) filter)
             find #fn("O200050007000W2000J7071?24W3000J7072?34W4000J60E?44W5000J60q?54W6000J60q?647324830>2125822684278528866::" #(#(:key
-  0 :from-end 4 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL :start 2 :end 3 NIL NIL NIL NIL NIL
-  NIL NIL NIL NIL NIL :test 1) identity equal? find-if #fn("n1AF062:") :key :start :end :from-end) find)
-            find-if #fn("O200040006000W2000J7071?24W3000J60E?34W4000J60q?44W5000J60q?54Ib:228:230828:>3_5147418352?14843A07518483~52?1@30q4853<076151?1@30q48:<161:" #(#(NIL
-  NIL NIL NIL NIL NIL :end 2 :key 0 :from-end 3 NIL NIL NIL NIL :start 1 NIL NIL) identity #0#
-  #fn("n10S;J;04AF0<51513500<:92<0=61:" #() find-if-) list-tail list-head reverse!) find-if)
+  0 :test 1 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL :end 3 :start 2 NIL NIL NIL NIL NIL NIL NIL NIL
+  NIL NIL NIL NIL :from-end 4) identity equal? find-if #fn("n1AF062:") :key :start :end :from-end) find)
+            find-if #fn("O200040006000W2000J7071?24W3000J60E?34W4000J60q?44W5000J60q?54Ib:228:230828:>3_5147418352?14843A07518483~52?1@30q4853<076151?1@30q48:<161:" #(#(:key
+  0 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL :end 2 :start 1 NIL NIL NIL NIL NIL NIL NIL NIL
+  NIL NIL NIL NIL :from-end 3) identity #0# #fn("n10S;J;04AF0<51513500<:92<0=61:" #() find-if-)
+  list-tail list-head reverse!) find-if)
             fits-i8 #fn("n10Y;3<0470r\xaf0r\xb063:" #(>=) fits-i8) fn-disasm
             #fn("\x871000.///W1000J60q?14z282JG07001E534715047260:@30q482<2305124051II252687>1?:5142527187>2?;514E288851b<I8<<8=L23\x8a24292:888<>2q7;53E8<<L23907150@30q4E87K~2<|48<8<<KM_48>2=8?2>523[08;8>8<<r45348:897?888<<52G5148<8<<r4M_@\x1912=8?2@523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xea12=8?2A523e08;8>8<<K5347B2C888<<G8>2DC70r3@30EM515148<8<<KM_@\xac12=8?2E523\\08;8>8<<r45347B2C7?888<<52515148<8<<r4M_@w12=8?2F523\xb808;8>8<<r88>2GC70r4@30EM5347B2C7?888<<52512H5248<8<<r4M_47B2C7?888<<52515148<8<<r4M_48>2GCY07B2H5147B2C7?888<<52512H5248<8<<r4M_@30q@\xe608?2Ic3^08;8>8<<r45347B2C7?888<<52512H5248<8<<r4M_@\xb202=8?2J523b08;8>8<<r25347B2K7L8<<7M888<<52M515248<8<<r2M_@w02=8?2N523b08;8>8<<r45347B2K7L8<<7?888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(fn-disasm
   newline void #fn(fn-code) #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -564,7 +564,7 @@
 	argcount(nargs, 1);
 	switch(tag(args[0])){
 	case TAG_CONS: return sl_conssym;
-	case TAG_NUM1: case TAG_NUM: return sl_fixnumsym;
+	case TAG_NUM: return sl_fixnumsym;
 	case TAG_SYM: return sl_symsym;
 	case TAG_VEC: return sl_vecsym;
 	case TAG_FN:
--- a/src/equal.c
+++ b/src/equal.c
@@ -81,7 +81,6 @@
 	int c;
 	switch(taga){
 	case TAG_NUM :
-	case TAG_NUM1:
 		if(isfixnum(b))
 			return (sl_fx)a < (sl_fx)b ? fixnum(-1) : fixnum(1);
 		if(iscprim(b)){
@@ -333,7 +332,6 @@
 	*oob = false;
 	switch(tg){
 	case TAG_NUM :
-	case TAG_NUM1:
 		u.d = (double)numval(a);
 		return doublehash(u.i64);
 	case TAG_FN:
--- a/src/ios.c
+++ b/src/ios.c
@@ -553,7 +553,7 @@
 	if(s->fd != -1 && s->ownfd)
 		close(s->fd);
 	s->fd = -1;
-	if(s->buf != nil && s->ownbuf && s->buf != &s->local[0])
+	if(s->ownbuf && s->buf != &s->local[0])
 		MEM_FREE(s->buf);
 	s->buf = nil;
 	s->size = s->maxsize = s->bpos = 0;
@@ -623,7 +623,7 @@
 	}
 	s->size = nvalid;
 
-	if(s->buf != nil && s->ownbuf && s->buf != &s->local[0])
+	if(s->ownbuf && s->buf != &s->local[0])
 		MEM_FREE(s->buf);
 	s->buf = buf;
 	s->maxsize = size;
--- a/src/print.c
+++ b/src/print.c
@@ -421,7 +421,7 @@
 
 	int n;
 	switch(tag(v)){
-	case TAG_NUM: case TAG_NUM1:
+	case TAG_NUM:
 		n = ios_printf(f, "%"PRIdFIXNUM, numval(v));
 		if(n < 1)
 			lerrorf(sl_errio, "write failed");
--- a/src/sl.h
+++ b/src/sl.h
@@ -15,7 +15,7 @@
 	TAG_CPRIM,
 	TAG_FN,
 	TAG_VEC,
-	TAG_NUM1,
+	TAG_EXT,
 	TAG_CVALUE,
 	TAG_SYM,
 	TAG_CONS,
@@ -43,13 +43,13 @@
 
 #if defined(BITS64)
 typedef s64int sl_fx;
-#define FIXNUM_BITS 62
+#define FIXNUM_BITS 61
 #define TOP_BIT (1ULL<<63)
 #define T_FIXNUM T_S64
 #define PRIdFIXNUM PRId64
 #else
 typedef s32int sl_fx;
-#define FIXNUM_BITS 30
+#define FIXNUM_BITS 29
 #define TOP_BIT (1U<<31)
 #define T_FIXNUM T_S32
 #define PRIdFIXNUM PRId32
@@ -102,8 +102,8 @@
 #define tag(x) ((x) & 7)
 #define ptr(x) ((void*)((uintptr)(x) & (~(uintptr)7)))
 #define tagptr(p, t) ((sl_v)(p) | (t))
-#define fixnum(x) ((sl_v)(x)<<2)
-#define numval(x)  ((sl_fx)(x)>>2)
+#define fixnum(x) ((sl_v)(x)<<3)
+#define numval(x)  ((sl_fx)(x)>>3)
 #define uintval(x) (((unsigned int)(x))>>3)
 #define builtin(n) tagptr(((sl_v)n<<3), TAG_FN)
 #define iscons(x) (tag(x) == TAG_CONS)
@@ -130,8 +130,8 @@
 		*(sl_v*)ptr(v) = (sl_v)(to) | FWD_BIT; \
 	}while(0)
 
-#define vec_size(v) (((usize*)ptr(v))[0]>>2)
-#define vec_setsize(v, n) (((usize*)ptr(v))[0] = ((n)<<2))
+#define vec_size(v) (((usize*)ptr(v))[0]>>3)
+#define vec_setsize(v, n) (((usize*)ptr(v))[0] = ((n)<<3))
 #define vec_elt(v, i) (((sl_v*)ptr(v))[1+(i)])
 #define vec_grow_amt(x) ((x)<8 ? 5 : 6*((x)>>3))
 // functions ending in _ are unsafe, faster versions
--- a/test/unittest.sl
+++ b/test/unittest.sl
@@ -94,9 +94,9 @@
 (assert (> 0x10000000000000000 0x8fffffffffffffff))
 (assert (< 0x8fffffffffffffff 0x10000000000000000))
 
-(assert (bignum? (ash 2 60)))
+(assert (bignum? (ash 2 59)))
 (def (bignum-on-32? x) (if #.(fixnum? 0xffffffff) (not (bignum? x)) (bignum? x)))
-(assert (bignum-on-32? (- (ash 2 60) 1)))
+(assert (bignum-on-32? (- (ash 2 59) 1)))
 (assert (bignum? 1606938044258990275541962092341162602522202993782792835301376))
 (assert (bignum? 0xfffffffffffffffff))
 (assert (bignum-on-32? 0xfffffffffffffff))