* libguile/vm-engine.h (CACHE_REGISTER): Sync stack_base too.
* libguile/vm-i-system.c (return): Inline FREE_FRAME here,
micro-optimizing a wee bit. Sounds silly, but it's to enable some
refactoring.
ip = vp->ip; \
sp = vp->sp; \
fp = vp->fp; \
+ stack_base = fp ? SCM_FRAME_UPPER_ADDRESS (fp) - 1 : vp->stack_base; \
}
#define SYNC_REGISTER() \
vm_return:
EXIT_HOOK ();
RETURN_HOOK ();
- FREE_FRAME ();
+ {
+ SCM ret, *data;
+ data = SCM_FRAME_DATA_ADDRESS (fp);
+
+ POP (ret);
+#ifdef THE_GOVERNMENT_IS_AFTER_ME
+ if (sp != stack_base)
+ abort ();
+ if (stack_base != data + 3)
+ abort ();
+#endif
+
+ /* Restore registers */
+ sp = SCM_FRAME_LOWER_ADDRESS (fp);
+ ip = SCM_FRAME_BYTE_CAST (data[3]);
+ fp = SCM_FRAME_STACK_CAST (data[2]);
+ stack_base = SCM_FRAME_UPPER_ADDRESS (fp) - 1;
+
+ /* Set return value (sp is already pushed) */
+ *sp = ret;
+ }
/* Restore the last program */
program = SCM_FRAME_PROGRAM (fp);