1
Fork 0
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:
Andy Wingo 2008-09-13 14:30:57 +02:00
parent 2cdb8cdc0d
commit f13c269b7f
2 changed files with 22 additions and 1 deletions

View file

@ -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() \

View file

@ -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);