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