shithub: sl

Download patch

ref: f04bb5fdca94bc8bf82887d2b76655b5a5bf984c
parent: 799a883deb19508113d8531bc0cf7f5f325bb7ef
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Apr 21 13:03:48 EDT 2025

vectors: redo types and "grown" vectors

--- a/src/read.c
+++ b/src/read.c
@@ -398,7 +398,7 @@
 	usize d = vec_grow_amt(s);
 	PUSH(v);
 	assert(s+d > s);
-	sl_v newv = alloc_vec(s+d, 1);
+	sl_v newv = alloc_vec(s+d, true);
 	v = sl.sp[-1];
 	for(i = 0; i < s; i++)
 		vec_elt(newv, i) = vec_elt(v, i);
@@ -405,7 +405,7 @@
 	// use gc to rewrite references from the old vector to the new
 	sl.sp[-1] = newv;
 	if(s > 0 && rewrite_refs){
-		((usize*)ptr(v))[0] |= 0x1;
+		((usize*)ptr(v))[0] |= VEC_GROWN;
 		vec_elt(v, 0) = newv;
 		sl_gc(false);
 	}
@@ -437,7 +437,7 @@
 	}
 	take(ctx);
 	if(i > 0)
-		vec_setsize(v, i, 0);
+		vec_setsize(v, i, VEC_VEC);
 	return POP();
 }
 
--- a/src/sl.c
+++ b/src/sl.c
@@ -363,7 +363,7 @@
 		return sl_emptyvec;
 	sl_v *c = alloc_words(n+1);
 	sl_v v = tagptr(c, TAG_VEC);
-	vec_setsize(v, n, 0);
+	vec_setsize(v, n, VEC_VEC);
 	if(init){
 		for(usize i = 0; i < n; i++)
 			vec_elt(v, i) = sl_void;
@@ -433,13 +433,13 @@
 	if(t == TAG_VEC){
 		// N.B.: 0-length vectors secretly have space for a first element
 		usize i, sz = vec_size(v);
-		if(vec_elt(v, -1) & 0x1){
+		if(vec_elt(v, -1) & VEC_GROWN){
 			// grown vector
 			nc = sl_relocate(vec_elt(v, 0));
 			forward(v, nc);
 		}else{
 			nc = tagptr(alloc_words(sz+1), TAG_VEC);
-			vec_setsize(nc, sz, 0);
+			vec_setsize(nc, sz, vec_type(v));
 			a = vec_elt(v, 0);
 			forward(v, nc);
 			if(sz > 0){
@@ -1459,8 +1459,8 @@
 			set(mk_sym(builtins[i].name, false), builtin(i));
 	}
 
-	sl_emptyvec = tagptr(alloc_words(1), TAG_VEC);
-	vec_setsize(sl_emptyvec, 0, 0);
+	sl_emptyvec = tagptr(alloc_words(2), TAG_VEC);
+	vec_setsize(sl_emptyvec, 0, VEC_VEC);
 
 	cvalues_init();
 
--- a/src/sl.h
+++ b/src/sl.h
@@ -158,11 +158,13 @@
 enum {
 	VEC_VEC,
 	VEC_STRUCT,
+	VEC_TYPE_MASK = 3,
+	VEC_GROWN = 1<<2,
 };
 #define vec_elt(v, i) (((sl_v*)ptr(v))[1+(i)])
 #define vec_size(v) uintval(vec_elt((v), -1))
 #define vec_setsize(v, n, type) do{ vec_elt((v), -1) = fixnum(n) | (type); }while(0)
-#define vec_type(v) (vec_elt((v), -1) & ((1<<TAG_BITS)-1))
+#define vec_type(v) (vec_elt((v), -1) & VEC_TYPE_MASK)
 #define isstruct(v) (vec_type(v) == VEC_STRUCT)
 #define vec_grow_amt(x) ((x)<8 ? 5 : 6*((x)>>3))