summaryrefslogtreecommitdiff
path: root/libguile/vm-i-system.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-09-13 14:40:27 +0200
committerAndy Wingo <wingo@pobox.com>2008-09-13 14:40:27 +0200
commit1dc8f8517c4f89f7e0a330fe7f5b945f2a8e2523 (patch)
tree4361df948482e7b5e4172e5355a624540135f722 /libguile/vm-i-system.c
parentf13c269b7ffde245f12503fc9c80f92fcea2026a (diff)
downloadguile-1dc8f8517c4f89f7e0a330fe7f5b945f2a8e2523.tar.gz
inline FREE_FRAME in halt
* libguile/vm-i-system.c (halt): Inline FREE_FRAME, specialized for the halt case.
Diffstat (limited to 'libguile/vm-i-system.c')
-rw-r--r--libguile/vm-i-system.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index aff8331e9..259e93861 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -58,9 +58,20 @@ VM_DEFINE_INSTRUCTION (halt, "halt", 0, 0, 0)
vp->time += scm_c_get_internal_run_time () - start_time;
HALT_HOOK ();
POP (ret);
- FREE_FRAME ();
+ {
+#ifdef THE_GOVERNMENT_IS_AFTER_ME
+ if (sp != stack_base)
+ abort ();
+ if (stack_base != SCM_FRAME_UPPER_ADDRESS (fp) - 1)
+ abort ();
+#endif
+
+ /* Restore registers */
+ sp = SCM_FRAME_LOWER_ADDRESS (fp) - 1;
+ ip = NULL;
+ fp = SCM_FRAME_DYNAMIC_LINK (fp);
+ }
SYNC_ALL ();
- vp->ip = NULL;
scm_dynwind_end ();
return ret;
}