From 5515edc5f21e042ade15cf508300c496ce2f4818 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 21 Nov 2013 17:21:37 +0100 Subject: [PATCH] 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. --- libguile/continuations.c | 2 +- libguile/frames.c | 33 +++++++++++++++++++++++---------- libguile/frames.h | 6 +++--- libguile/stacks.c | 2 +- libguile/vm.c | 2 +- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/libguile/continuations.c b/libguile/continuations.c index 31e36441a..ff118df24 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -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); diff --git a/libguile/frames.c b/libguile/frames.c index 824f2c84e..b0f451f7d 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -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; + + case SCM_VM_FRAME_KIND_VM: + return ((struct scm_vm *) stack_holder)->stack_base; - return SCM_VM_DATA (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; + + case SCM_VM_FRAME_KIND_VM: + return 0; - return 0; + default: + abort (); + } } #undef FUNC_NAME diff --git a/libguile/frames.h b/libguile/frames.h index 67130ad61..e48bb48e6 100644 --- a/libguile/frames.h +++ b/libguile/frames.h @@ -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 diff --git a/libguile/stacks.c b/libguile/stacks.c index c478b06e2..360b35f7b 100644 --- a/libguile/stacks.c +++ b/libguile/stacks.c @@ -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); diff --git a/libguile/vm.c b/libguile/vm.c index afb5c4281..c4e48952b 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -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; -- 2.20.1