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)
--
⑨