shithub: sl

Download patch

ref: 3f4a4920030c1b18c16ee4c49a4a92181807f63c
parent: 7c4d7e09b3801f7453762953992727a9365d4293
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Feb 12 01:30:28 EST 2025

closure op: refactor for readability

--- a/src/vm.inc
+++ b/src/vm.inc
@@ -230,28 +230,22 @@
 OP(OP_CLOSURE)
 	n = *ip++;
 	assert(n > 0);
-	pv = alloc_words(n + 1);
+	pv = alloc_words(1+n + sizeof(function_t)/sizeof(value_t));
 	v = tagptr(pv, TAG_VECTOR);
-	i = 0;
-	pv[i++] = fixnum(n);
-	do{
-		pv[i] = FL(stack)[FL(sp)-n + i-1];
-		i++;
-	}while(i <= n);
+	*pv++ = fixnum(n);
+	for(i = 0; i < n; i++)
+		*pv++ = FL(stack)[FL(sp)-n+i];
 	POPN(n);
 	PUSH(v);
-	if(fl_unlikely((value_t*)FL(curheap) > (value_t*)FL(lim)-2))
-		fl_gc(0);
-	pv = (value_t*)FL(curheap);
-	FL(curheap) += 4*sizeof(value_t);
+	fn = (function_t*)pv;
 	e = FL(stack)[FL(sp)-2];  // closure to copy
 	assert(isfunction(e));
-	pv[0] = ((value_t*)ptr(e))[0];
-	pv[1] = ((value_t*)ptr(e))[1];
-	pv[2] = FL(stack)[FL(sp)-1];  // env
-	pv[3] = ((value_t*)ptr(e))[3];
+	fn->bcode = fn_bcode(e);
+	fn->vals = fn_vals(e);
+	fn->env = FL(stack)[FL(sp)-1];
+	fn->name = fn_name(e);
 	POPN(1);
-	FL(stack)[FL(sp)-1] = tagptr(pv, TAG_FUNCTION);
+	FL(stack)[FL(sp)-1] = tagptr(fn, TAG_FUNCTION);
 	NEXT_OP;
 
 OP(OP_CONS)