diff options
author | Andy Wingo <wingo@pobox.com> | 2008-09-13 14:30:57 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2008-09-13 14:30:57 +0200 |
commit | f13c269b7ffde245f12503fc9c80f92fcea2026a (patch) | |
tree | a7ac8b8fea5b6d24b8fb70965b4fe751926aa8e8 /libguile/vm-i-system.c | |
parent | 2cdb8cdc0d0201e3381b01baa2fc2f501dbed4db (diff) | |
download | guile-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.
Diffstat (limited to 'libguile/vm-i-system.c')
-rw-r--r-- | libguile/vm-i-system.c | 22 |
1 files changed, 21 insertions, 1 deletions
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); |