shithub: sl

Download patch

ref: 3ac4a7438c33cdd5405f7c276eaf903b27188512
parent: fa6de0c042b52461ee5e7dc6088375f62d83cf62
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Mar 7 21:10:14 EST 2025

relocate → sl_relocate

--- a/src/sl.c
+++ b/src/sl.c
@@ -363,7 +363,7 @@
 }
 
 sl_v
-relocate(sl_v v)
+sl_relocate(sl_v v)
 {
 	sl_v a, d, nc, first, *pcdr;
 
@@ -384,11 +384,11 @@
 			*pcdr = nc = tagptr((sl_cons*)slg.curheap, TAG_CONS);
 			slg.curheap += sizeof(sl_cons);
 			forward(v, nc);
-			car_(nc) = ismanaged(a) ? relocate(a) : a;
+			car_(nc) = ismanaged(a) ? sl_relocate(a) : a;
 			pcdr = &cdr_(nc);
 			v = d;
 		}while(iscons(v));
-		*pcdr = d == sl_nil ? sl_nil : relocate(d);
+		*pcdr = d == sl_nil ? sl_nil : sl_relocate(d);
 		return first;
 	}
 
@@ -404,7 +404,7 @@
 		usize i, sz = vector_size(v);
 		if(vector_elt(v, -1) & 0x1){
 			// grown vector
-			nc = relocate(vector_elt(v, 0));
+			nc = sl_relocate(vector_elt(v, 0));
 			forward(v, nc);
 		}else{
 			nc = tagptr(alloc_words(sz+1), TAG_VECTOR);
@@ -412,9 +412,9 @@
 			a = vector_elt(v, 0);
 			forward(v, nc);
 			if(sz > 0){
-				vector_elt(nc, 0) = relocate(a);
+				vector_elt(nc, 0) = sl_relocate(a);
 				for(i = 1; i < sz; i++)
-					vector_elt(nc, i) = relocate(vector_elt(v, i));
+					vector_elt(nc, i) = sl_relocate(vector_elt(v, i));
 			}
 		}
 		return nc;
@@ -426,9 +426,9 @@
 		nfn->bcode = fn->bcode;
 		nc = tagptr(nfn, TAG_FUNCTION);
 		forward(v, nc);
-		nfn->vals = relocate(nfn->vals);
-		nfn->bcode = relocate(nfn->bcode);
-		nfn->env = relocate(fn->env);
+		nfn->vals = sl_relocate(nfn->vals);
+		nfn->bcode = sl_relocate(nfn->bcode);
+		nfn->env = sl_relocate(fn->env);
 		assert(!ismanaged(fn->name));
 		nfn->name = fn->name;
 		return nc;
@@ -442,7 +442,7 @@
 		nc = tagptr(ng, TAG_SYM);
 		forward(v, nc);
 		if(sl_likely(ng->binding != UNBOUND))
-			ng->binding = relocate(ng->binding);
+			ng->binding = sl_relocate(ng->binding);
 		return nc;
 	}
 	if(t == TAG_CPRIM){
@@ -465,7 +465,7 @@
 	sl_sym *v;
 	while(Tnext(slg.symbols, &k, (void**)&v)){
 		if(v->binding != UNBOUND)
-			v->binding = relocate(v->binding);
+			v->binding = sl_relocate(v->binding);
 	}
 }
 
@@ -473,11 +473,8 @@
 sl_gc(bool mustgrow)
 {
 	slg.gccalls++;
-	slg.curheap = slg.tospace;
-	if(slg.grew)
-		slg.lim = slg.curheap+slg.heapsize*2-sizeof(sl_cons);
-	else
-		slg.lim = slg.curheap+slg.heapsize-sizeof(sl_cons);
+	slg.lim = slg.curheap = slg.tospace;
+	slg.lim += slg.heapsize * (slg.grew ? 2 : 1) - sizeof(sl_cons);
 
 	sl_v *top, *f;
 	if(sl.throwing_frame > sl.curr_frame){
@@ -489,7 +486,7 @@
 	}
 	for(;;){
 		for(sl_v *p = f; p < top; p++)
-			*p = relocate(*p);
+			*p = sl_relocate(*p);
 		if(f == sl.stack)
 			break;
 		top = f - 3;
@@ -496,7 +493,7 @@
 		f = (sl_v*)*top;
 	}
 	for(int i = 0; i < slg.ngchandles; i++)
-		*slg.gchandles[i] = relocate(*slg.gchandles[i]);
+		*slg.gchandles[i] = sl_relocate(*slg.gchandles[i]);
 	trace_globals();
 	relocate_typetable();
 	sl_readstate *rs = sl.readstate;
@@ -505,20 +502,20 @@
 		for(int i = 0; i < rs->backrefs.size; i++){
 			ent = (sl_v)rs->backrefs.table[i];
 			if(ent != (sl_v)HT_NOTFOUND)
-				rs->backrefs.table[i] = (void*)relocate(ent);
+				rs->backrefs.table[i] = (void*)sl_relocate(ent);
 		}
 		for(int i = 0; i < rs->gensyms.size; i++){
 			ent = (sl_v)rs->gensyms.table[i];
 			if(ent != (sl_v)HT_NOTFOUND)
-				rs->gensyms.table[i] = (void*)relocate(ent);
+				rs->gensyms.table[i] = (void*)sl_relocate(ent);
 		}
-		rs->source = relocate(rs->source);
+		rs->source = sl_relocate(rs->source);
 		rs = rs->prev;
 	}
-	sl.lasterror = relocate(sl.lasterror);
-	sl_erroom = relocate(sl_erroom);
-	sl_emptyvec = relocate(sl_emptyvec);
-	sl_emptystr = relocate(sl_emptystr);
+	sl.lasterror = sl_relocate(sl.lasterror);
+	sl_erroom = sl_relocate(sl_erroom);
+	sl_emptyvec = sl_relocate(sl_emptyvec);
+	sl_emptystr = sl_relocate(sl_emptystr);
 
 	sweep_finalizers();
 
--- a/src/sl.h
+++ b/src/sl.h
@@ -181,7 +181,7 @@
 _Noreturn void sl_exit(int status);
 
 /* collector */
-sl_v relocate(sl_v v) sl_hotfn;
+sl_v sl_relocate(sl_v v) sl_hotfn;
 void sl_gc(bool mustgrow);
 void sl_gc_handle(sl_v *pv);
 void sl_free_gc_handles(int n);
--- a/src/table.c
+++ b/src/table.c
@@ -55,7 +55,7 @@
 	h->i = oldh->i;
 	for(int i = 0; i < h->size; i++){
 		if(h->table[i] != HT_NOTFOUND)
-			h->table[i] = (void*)relocate((sl_v)h->table[i]);
+			h->table[i] = (void*)sl_relocate((sl_v)h->table[i]);
 	}
 }
 
--- a/src/types.c
+++ b/src/types.c
@@ -77,7 +77,7 @@
 	sl_htable *h = &slg.types;
 	for(int i = 0; i < h->size; i += 2){
 		if(h->table[i] != HT_NOTFOUND){
-			void *nv = (void*)relocate((sl_v)h->table[i]);
+			void *nv = (void*)sl_relocate((sl_v)h->table[i]);
 			h->table[i] = nv;
 			if(h->table[i+1] != HT_NOTFOUND)
 				((sl_type*)h->table[i+1])->type = (sl_v)nv;