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)