mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 03:30:27 +02:00
Heap frame "stack holders" are raw scm_vm / scm_vm_cont pointers
* libguile/frames.h (struct scm_frame): stack_holder is a void*. * libguile/frames.c (scm_i_frame_stack_base, scm_i_frame_offset): Expect stack_holder to be the raw struct scm_vm or scm_vm_cont. * libguile/continuations.c (scm_i_continuation_to_frame): * libguile/stacks.c (scm_make_stack) * libguile/vm.c (vm_dispatch_hook): Adapt creators.
This commit is contained in:
parent
050a40db5b
commit
5515edc5f2
5 changed files with 29 additions and 16 deletions
|
@ -177,7 +177,7 @@ scm_i_continuation_to_frame (SCM continuation)
|
|||
if (scm_is_true (cont->vm_cont))
|
||||
{
|
||||
struct scm_vm_cont *data = SCM_VM_CONT_DATA (cont->vm_cont);
|
||||
return scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, cont->vm_cont,
|
||||
return scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, data,
|
||||
(data->fp + data->reloc) - data->stack_base,
|
||||
(data->sp + data->reloc) - data->stack_base,
|
||||
data->ra);
|
||||
|
|
|
@ -37,7 +37,7 @@ verify (offsetof (struct scm_vm_frame, dynamic_link) == 0);
|
|||
(((SCM *) (val)) + SCM_VM_FRAME_OFFSET (frame))
|
||||
|
||||
SCM
|
||||
scm_c_make_frame (enum scm_vm_frame_kind frame_kind, SCM stack_holder,
|
||||
scm_c_make_frame (enum scm_vm_frame_kind frame_kind, void *stack_holder,
|
||||
scm_t_ptrdiff fp_offset, scm_t_ptrdiff sp_offset,
|
||||
scm_t_uint32 *ip)
|
||||
{
|
||||
|
@ -65,34 +65,47 @@ SCM*
|
|||
scm_i_frame_stack_base (SCM frame)
|
||||
#define FUNC_NAME "frame-stack-base"
|
||||
{
|
||||
SCM stack_holder;
|
||||
void *stack_holder;
|
||||
|
||||
SCM_VALIDATE_VM_FRAME (1, frame);
|
||||
|
||||
stack_holder = SCM_VM_FRAME_STACK_HOLDER (frame);
|
||||
|
||||
if (SCM_VM_CONT_P (stack_holder))
|
||||
return SCM_VM_CONT_DATA (stack_holder)->stack_base;
|
||||
switch (SCM_VM_FRAME_KIND (frame))
|
||||
{
|
||||
case SCM_VM_FRAME_KIND_CONT:
|
||||
return ((struct scm_vm_cont *) stack_holder)->stack_base;
|
||||
|
||||
return SCM_VM_DATA (stack_holder)->stack_base;
|
||||
case SCM_VM_FRAME_KIND_VM:
|
||||
return ((struct scm_vm *) stack_holder)->stack_base;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
||||
scm_t_ptrdiff
|
||||
scm_i_frame_offset (SCM frame)
|
||||
#define FUNC_NAME "frame-offset"
|
||||
{
|
||||
SCM stack_holder;
|
||||
void *stack_holder;
|
||||
|
||||
SCM_VALIDATE_VM_FRAME (1, frame);
|
||||
|
||||
stack_holder = SCM_VM_FRAME_STACK_HOLDER (frame);
|
||||
|
||||
if (SCM_VM_CONT_P (stack_holder))
|
||||
return SCM_VM_CONT_DATA (stack_holder)->reloc;
|
||||
switch (SCM_VM_FRAME_KIND (frame))
|
||||
{
|
||||
case SCM_VM_FRAME_KIND_CONT:
|
||||
return ((struct scm_vm_cont *) stack_holder)->reloc;
|
||||
|
||||
return 0;
|
||||
case SCM_VM_FRAME_KIND_VM:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
|
|
@ -140,7 +140,7 @@ struct scm_vm_frame
|
|||
|
||||
struct scm_frame
|
||||
{
|
||||
SCM stack_holder;
|
||||
void *stack_holder;
|
||||
scm_t_ptrdiff fp_offset;
|
||||
scm_t_ptrdiff sp_offset;
|
||||
scm_t_uint32 *ip;
|
||||
|
@ -154,7 +154,7 @@ enum scm_vm_frame_kind
|
|||
|
||||
#define SCM_VM_FRAME_P(x) (SCM_HAS_TYP7 (x, scm_tc7_frame))
|
||||
#define SCM_VM_FRAME_KIND(x) ((enum scm_vm_frame_kind) (SCM_CELL_WORD_0 (x) >> 8))
|
||||
#define SCM_VM_FRAME_DATA(x) ((struct scm_frame*)SCM_CELL_WORD_1 (x))
|
||||
#define SCM_VM_FRAME_DATA(x) ((struct scm_frame *)SCM_CELL_WORD_1 (x))
|
||||
#define SCM_VM_FRAME_STACK_HOLDER(f) SCM_VM_FRAME_DATA (f)->stack_holder
|
||||
#define SCM_VM_FRAME_FP_OFFSET(f) SCM_VM_FRAME_DATA (f)->fp_offset
|
||||
#define SCM_VM_FRAME_SP_OFFSET(f) SCM_VM_FRAME_DATA (f)->sp_offset
|
||||
|
@ -168,7 +168,7 @@ SCM_INTERNAL SCM* scm_i_frame_stack_base (SCM frame);
|
|||
SCM_INTERNAL scm_t_ptrdiff scm_i_frame_offset (SCM frame);
|
||||
|
||||
SCM_INTERNAL SCM scm_c_make_frame (enum scm_vm_frame_kind vm_frame_kind,
|
||||
SCM stack_holder, scm_t_ptrdiff fp_offset,
|
||||
void *stack_holder, scm_t_ptrdiff fp_offset,
|
||||
scm_t_ptrdiff sp_offset, scm_t_uint32 *ip);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -258,7 +258,7 @@ SCM_DEFINE (scm_make_stack, "make-stack", 1, 0, 1,
|
|||
cont = scm_i_capture_current_stack ();
|
||||
c = SCM_VM_CONT_DATA (cont);
|
||||
|
||||
frame = scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, cont,
|
||||
frame = scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, c,
|
||||
(c->fp + c->reloc) - c->stack_base,
|
||||
(c->sp + c->reloc) - c->stack_base,
|
||||
c->ra);
|
||||
|
|
|
@ -202,7 +202,7 @@ vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n)
|
|||
while the stack frame represented by the frame object is visible, so it
|
||||
seems reasonable to limit the lifetime of frame objects. */
|
||||
|
||||
c_frame.stack_holder = vm;
|
||||
c_frame.stack_holder = vp;
|
||||
c_frame.fp_offset = vp->fp - vp->stack_base;
|
||||
c_frame.sp_offset = vp->sp - vp->stack_base;
|
||||
c_frame.ip = vp->ip;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue