summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-09-13 14:30:57 +0200
committerAndy Wingo <wingo@pobox.com>2008-09-13 14:30:57 +0200
commitf13c269b7ffde245f12503fc9c80f92fcea2026a (patch)
treea7ac8b8fea5b6d24b8fb70965b4fe751926aa8e8
parent2cdb8cdc0d0201e3381b01baa2fc2f501dbed4db (diff)
downloadguile-f13c269b7ffde245f12503fc9c80f92fcea2026a.tar.gz
inline FREE_FRAME in return, sync stack_base in CACHE_REGISTER
* 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.
-rw-r--r--libguile/vm-engine.h1
-rw-r--r--libguile/vm-i-system.c22
2 files changed, 22 insertions, 1 deletions
diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h
index 370a42b15..c86307c86 100644
--- a/libguile/vm-engine.h
+++ b/libguile/vm-engine.h
@@ -132,6 +132,7 @@
ip = vp->ip; \
sp = vp->sp; \
fp = vp->fp; \
+ stack_base = fp ? SCM_FRAME_UPPER_ADDRESS (fp) - 1 : vp->stack_base; \
}
#define SYNC_REGISTER() \
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index 546891169..aff8331e9 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -670,7 +670,27 @@ VM_DEFINE_INSTRUCTION (return, "return", 0, 0, 1)
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);