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