shithub: sl

Download patch

ref: 8eed926101b183ab1c3933b2ab918ed81a5ce2d4
parent: c5c81ebe977ed73579d6c75846447fdb83177ed2
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Feb 13 14:56:12 EST 2025

vm: _applyn restore stack, no need for repetition elsewhere

--- a/src/flisp.c
+++ b/src/flisp.c
@@ -576,7 +576,7 @@
 	uint32_t saveSP = FL(sp);
 	value_t v;
 	if(iscbuiltin(f))
-		v = ((cvalue_t*)ptr(f))->cbuiltin(&FL(stack)[FL(sp)-n], n);
+		v = ((cvalue_t*)ptr(f))->cbuiltin(&FL(stack)[saveSP-n], n);
 	else if(isfunction(f))
 		v = apply_cl(n);
 	else if(fl_likely(isbuiltin(f))){
@@ -583,7 +583,7 @@
 		value_t tab = symbol_value(FL_builtins_table_sym);
 		if(fl_unlikely(ptr(tab) == nil))
 			unbound_error(tab);
-		FL(stack)[FL(sp)-n-1] = vector_elt(tab, uintval(f));
+		FL(stack)[saveSP-n-1] = vector_elt(tab, uintval(f));
 		v = apply_cl(n);
 	}else{
 		type_error("function", f);
@@ -1372,12 +1372,10 @@
 fl_load_system_image(value_t sys_image_iostream)
 {
 	value_t e;
-	uint32_t saveSP;
 	symbol_t *sym;
 
 	FL(loading) = true;
 	PUSH(sys_image_iostream);
-	saveSP = FL(sp);
 	FL_TRY{
 		while(1){
 			e = fl_read_sexpr(FL(stack)[FL(sp)-1]);
@@ -1387,7 +1385,6 @@
 				// stage 0 format: series of thunks
 				PUSH(e);
 				(void)_applyn(0);
-				FL(sp) = saveSP;
 			}else{
 				// stage 1 format: list alternating symbol/value
 				while(iscons(e)){
--- a/src/vm.inc
+++ b/src/vm.inc
@@ -741,19 +741,17 @@
 
 OP(OP_FOR)
 	FL(stack)[ipd] = (uintptr_t)ip;
-	s  = tofixnum(FL(stack)[FL(sp)-3]);
-	hi = tofixnum(FL(stack)[FL(sp)-2]);
-	v = FL_void;
+	i = FL(sp);
+	s  = tofixnum(FL(stack)[i-3]);
+	hi = tofixnum(FL(stack)[i-2]);
 	FL(sp) += 2;
-	n = FL(sp);
-	for(; s <= hi; s++){
-		FL(stack)[FL(sp)-2] = FL(stack)[FL(sp)-3];
-		FL(stack)[FL(sp)-1] = fixnum(s);
+	for(v = FL_void; s <= hi; s++){
+		FL(stack)[i+0] = FL(stack)[i-1];
+		FL(stack)[i+1] = fixnum(s);
 		v = _applyn(1);
-		FL(sp) = n;
 	}
 	POPN(4);
-	FL(stack)[FL(sp)-1] = v;
+	FL(stack)[i+1] = v;
 	NEXT_OP;
 
 OP(OP_SETGL)
--