mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 04:10:18 +02:00
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.
This commit is contained in:
parent
2cdb8cdc0d
commit
f13c269b7f
2 changed files with 22 additions and 1 deletions
|
@ -132,6 +132,7 @@
|
||||||
ip = vp->ip; \
|
ip = vp->ip; \
|
||||||
sp = vp->sp; \
|
sp = vp->sp; \
|
||||||
fp = vp->fp; \
|
fp = vp->fp; \
|
||||||
|
stack_base = fp ? SCM_FRAME_UPPER_ADDRESS (fp) - 1 : vp->stack_base; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYNC_REGISTER() \
|
#define SYNC_REGISTER() \
|
||||||
|
|
|
@ -670,7 +670,27 @@ VM_DEFINE_INSTRUCTION (return, "return", 0, 0, 1)
|
||||||
vm_return:
|
vm_return:
|
||||||
EXIT_HOOK ();
|
EXIT_HOOK ();
|
||||||
RETURN_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 */
|
/* Restore the last program */
|
||||||
program = SCM_FRAME_PROGRAM (fp);
|
program = SCM_FRAME_PROGRAM (fp);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue