mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 23:50:19 +02:00
reorder frame layout
* libguile/frames.h: Reorder the frame layout so the return address comes below the arguments.working (SCM_FRAME_SET_RETURN_ADDRESS, SCM_FRAME_SET_MV_RETURN_ADDRESS): New macros. * libguile/frames.c (scm_vm_frame_arguments): Use the macros to access the arguments. * libguile/vm-engine.c (vm_engine): Fix for new calling convention. * libguile/vm-engine.h (INIT_FRAME): New macro. Does part of what NEW_FRAME used to do. * libguile/vm-i-system.c (call, mv-call): Shuffle args up to make room for the stack, and adapt to new calling convention. (goto/args): Shuffling down is easier now. (return, return/args): Adapt to new frame layout. * libguile/vm.c (vm_mark_stack): Adapt to new frame layout, and the possibility of there being crap on the stack. (really_make_boot_program): Remove extraneous comment.
This commit is contained in:
parent
d94be25f72
commit
03e6c16596
6 changed files with 85 additions and 123 deletions
|
@ -386,34 +386,29 @@ do { \
|
|||
/* See frames.h for the layout of stack frames */
|
||||
/* When this is called, bp points to the new program data,
|
||||
and the arguments are already on the stack */
|
||||
#define NEW_FRAME() \
|
||||
#define INIT_FRAME() \
|
||||
{ \
|
||||
int i; \
|
||||
SCM *dl, *data; \
|
||||
scm_byte_t *ra = ip; \
|
||||
\
|
||||
/* Save old registers */ \
|
||||
ra = ip; \
|
||||
dl = fp; \
|
||||
\
|
||||
/* New registers */ \
|
||||
fp = sp - bp->nargs + 1; \
|
||||
data = SCM_FRAME_DATA_ADDRESS (fp); \
|
||||
sp = data + 2; \
|
||||
sp += bp->nlocs; \
|
||||
CHECK_OVERFLOW (); \
|
||||
stack_base = sp; \
|
||||
ip = bp->base; \
|
||||
\
|
||||
/* Init local variables */ \
|
||||
for (i=bp->nlocs; i; i--) \
|
||||
data[-i] = SCM_UNDEFINED; \
|
||||
\
|
||||
/* Set frame data */ \
|
||||
data[2] = (SCM)ra; \
|
||||
data[1] = 0x0; \
|
||||
data[0] = (SCM)dl; \
|
||||
for (i=bp->nlocs; i;) \
|
||||
sp[-(--i)] = SCM_UNDEFINED; \
|
||||
}
|
||||
|
||||
#define DROP_FRAME() \
|
||||
{ \
|
||||
sp -= 3; \
|
||||
NULLSTACK (3); \
|
||||
CHECK_UNDERFLOW (); \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
c-file-style: "gnu"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue