shithub: sl

Download patch

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