ref: ea74e72bf9f4ba8cc9bf290b3c6c748bc277d48e
parent: 6266f48f00cbc33e8a534ed82633bbe9a4855bc7
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sat Feb 8 23:44:34 EST 2025
apply_cl: function_t: access through a pointer once
--- a/src/flisp.c
+++ b/src/flisp.c
@@ -413,7 +413,7 @@
}
if(t == TAG_FUNCTION){
function_t *fn = ptr(v);
- function_t *nfn = alloc_words(4);
+ function_t *nfn = alloc_words(sizeof(function_t)/sizeof(value_t));
nfn->bcode = fn->bcode;
nfn->vals = fn->vals;
nc = tagptr(nfn, TAG_FUNCTION);
@@ -886,7 +886,8 @@
symbol_t *sym;
cons_t *c;
value_t *pv;
- value_t func, v, e;
+ value_t v, e;
+ function_t *fn;
int x;
n = 0;
@@ -895,19 +896,18 @@
USED(v);
apply_cl_top:
bp = FL(sp)-nargs;
- func = FL(stack)[bp-1];
- ip = cvalue_data(fn_bcode(func));
+ fn = (function_t*)ptr(FL(stack)[bp-1]);
+ ip = cvalue_data(fn->bcode);
assert(!ismanaged((uintptr_t)ip));
i = FL(sp)+GET_INT32(ip);
+ ip += 4;
while(i >= FL(nstack))
fl_grow_stack();
- ip += 4;
- PUSH(fn_env(func));
+ PUSH(fn->env);
PUSH(FL(curr_frame));
PUSH(nargs);
- ipd = FL(sp);
- FL(sp)++; // ip
+ ipd = FL(sp)++;
FL(curr_frame) = FL(sp);
#if defined(COMPUTED_GOTO)
--- a/src/flisp.h
+++ b/src/flisp.h
@@ -137,10 +137,10 @@
#define cdr_(v) (((cons_t*)ptr(v))->cdr)
#define car(v) (tocons((v))->car)
#define cdr(v) (tocons((v))->cdr)
-#define fn_bcode(f) (((value_t*)ptr(f))[0])
-#define fn_vals(f) (((value_t*)ptr(f))[1])
-#define fn_env(f) (((value_t*)ptr(f))[2])
-#define fn_name(f) (((value_t*)ptr(f))[3])
+#define fn_bcode(f) (((function_t*)ptr(f))->bcode)
+#define fn_vals(f) (((function_t*)ptr(f))->vals)
+#define fn_env(f) (((function_t*)ptr(f))->env)
+#define fn_name(f) (((function_t*)ptr(f))->name)
#define set(s, v) (((symbol_t*)ptr(s))->binding = (v))
#define setc(s, v) \
do{ \
@@ -328,7 +328,7 @@
#define cp_class(cp) (((cprim_t*)(cp))->type)
#define cp_type(cp) (cp_class(cp)->type)
#define cp_numtype(cp) (cp_class(cp)->numtype)
-#define cp_data(cp) (&((cprim_t*)(cp))->_space[0])
+#define cp_data(cp) (((cprim_t*)(cp))->_space)
// WARNING: multiple evaluation!
#define cptr(v) (iscprim(v) ? cp_data(ptr(v)) : cvalue_data(v))
--- a/src/vm.inc
+++ b/src/vm.inc
@@ -39,9 +39,9 @@
}
LABEL(do_call):
FL(stack)[ipd] = (uintptr_t)ip;
- func = FL(stack)[FL(sp)-n-1];
- if(tag(func) == TAG_FUNCTION){
- if(func > (N_BUILTINS<<3)){
+ v = FL(stack)[FL(sp)-n-1];
+ if(tag(v) == TAG_FUNCTION){
+ if(v > (N_BUILTINS<<3)){
if(tail){
FL(curr_frame) = FL(stack)[FL(curr_frame)-3];
for(s = -1; s < (fixnum_t)n; s++)
@@ -51,8 +51,8 @@
nargs = n;
goto apply_cl_top;
}else{
- i = uintval(func);
- if(isbuiltin(func)){
+ i = uintval(v);
+ if(isbuiltin(v)){
s = builtins[i].nargs;
if(s >= 0)
argcount(n, (unsigned)s);
@@ -84,14 +84,14 @@
}
}
}
- }else if(fl_likely(iscbuiltin(func))){
+ }else if(fl_likely(iscbuiltin(v))){
s = FL(sp) - n;
- v = ((cvalue_t*)ptr(func))->cbuiltin(&FL(stack)[s], n);
+ v = ((cvalue_t*)ptr(v))->cbuiltin(&FL(stack)[s], n);
FL(sp) = s;
FL(stack)[s-1] = v;
NEXT_OP;
}
- type_error("function", func);
+ type_error("function", v);
OP(OP_LOADGL)
v = fn_vals(FL(stack)[bp-1]);