diff --git a/libguile/frames.c b/libguile/frames.c index f89b0fd5b..a1c7f3e71 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -309,8 +309,6 @@ SCM_DEFINE (scm_frame_return_address, "frame-return-address", 1, 0, 0, } #undef FUNC_NAME -#define RELOC(kind, frame, val) ((val) + frame_offset (kind, frame)) - SCM_DEFINE (scm_frame_dynamic_link, "frame-dynamic-link", 1, 0, 0, (SCM frame), "") @@ -320,8 +318,7 @@ SCM_DEFINE (scm_frame_dynamic_link, "frame-dynamic-link", 1, 0, 0, /* fixme: munge fp if holder is a continuation */ return scm_from_uintptr_t ((scm_t_uintptr) - RELOC (SCM_VM_FRAME_KIND (frame), SCM_VM_FRAME_DATA (frame), - SCM_FRAME_DYNAMIC_LINK (SCM_VM_FRAME_FP (frame)))); + SCM_FRAME_DYNAMIC_LINK (SCM_VM_FRAME_FP (frame))); } #undef FUNC_NAME @@ -339,12 +336,7 @@ scm_c_frame_previous (enum scm_vm_frame_kind kind, struct scm_frame *frame) new_fp = SCM_FRAME_DYNAMIC_LINK (this_fp); - if (!new_fp) - return 0; - - new_fp = RELOC (kind, frame, new_fp); - - if (new_fp > stack_top) + if (new_fp >= stack_top) return 0; new_sp = SCM_FRAME_PREVIOUS_SP (this_fp); diff --git a/libguile/frames.h b/libguile/frames.h index 870477d53..e1130e94b 100644 --- a/libguile/frames.h +++ b/libguile/frames.h @@ -88,7 +88,7 @@ /* Each element on the stack occupies the same amount of space. */ union scm_vm_stack_element { - union scm_vm_stack_element *as_fp; + scm_t_uintptr as_uint; scm_t_uint32 *as_ip; SCM as_scm; @@ -100,8 +100,8 @@ union scm_vm_stack_element #define SCM_FRAME_PREVIOUS_SP(fp) ((fp) + 2) #define SCM_FRAME_RETURN_ADDRESS(fp) ((fp)[0].as_ip) #define SCM_FRAME_SET_RETURN_ADDRESS(fp, ra) ((fp)[0].as_ip = (ra)) -#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp)[1].as_fp) -#define SCM_FRAME_SET_DYNAMIC_LINK(fp, dl) ((fp)[1].as_fp = (dl)) +#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp) + (fp)[1].as_uint) +#define SCM_FRAME_SET_DYNAMIC_LINK(fp, dl) ((fp)[1].as_uint = ((dl) - (fp))) #define SCM_FRAME_SLOT(fp,i) ((fp) - (i) - 1) #define SCM_FRAME_LOCAL(fp,i) (SCM_FRAME_SLOT (fp, i)->as_scm) #define SCM_FRAME_NUM_LOCALS(fp, sp) ((fp) - (sp)) diff --git a/libguile/vm.c b/libguile/vm.c index bc9f29080..2db079550 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -179,21 +179,6 @@ vm_return_to_continuation_inner (void *data_ptr) cp->stack_size * sizeof (*cp->stack_bottom)); vm_restore_sp (vp, vp->stack_top - cp->stack_size); - if (reloc) - { - union scm_vm_stack_element *fp = vp->fp; - while (fp) - { - union scm_vm_stack_element *next_fp = SCM_FRAME_DYNAMIC_LINK (fp); - if (next_fp) - { - next_fp += reloc; - SCM_FRAME_SET_DYNAMIC_LINK (fp, next_fp); - } - fp = next_fp; - } - } - return NULL; } @@ -385,13 +370,6 @@ vm_reinstate_partial_continuation_inner (void *data_ptr) vp->fp = cp->fp + reloc; vp->ip = cp->ra; - /* now relocate frame pointers */ - { - union scm_vm_stack_element *fp; - for (fp = vp->fp; fp < base_fp; fp = SCM_FRAME_DYNAMIC_LINK (fp)) - SCM_FRAME_SET_DYNAMIC_LINK (fp, SCM_FRAME_DYNAMIC_LINK (fp) + reloc); - } - data->reloc = reloc; return NULL; @@ -876,7 +854,7 @@ make_vm (void) vp->ip = NULL; vp->sp = vp->stack_top; vp->sp_min_since_gc = vp->sp; - vp->fp = NULL; + vp->fp = vp->stack_top; vp->engine = vm_default_engine; vp->trace_level = 0; for (i = 0; i < SCM_VM_NUM_HOOKS; i++) @@ -967,7 +945,9 @@ scm_i_vm_mark_stack (struct scm_vm *vp, struct GC_ms_entry *mark_stack_ptr, memset (&cache, 0, sizeof (cache)); - for (fp = vp->fp, sp = vp->sp; fp; fp = SCM_FRAME_DYNAMIC_LINK (fp)) + for (fp = vp->fp, sp = vp->sp; + fp < vp->stack_top; + fp = SCM_FRAME_DYNAMIC_LINK (fp)) { scm_t_ptrdiff nlocals = SCM_FRAME_NUM_LOCALS (fp, sp); size_t slot = nlocals - 1; @@ -1047,24 +1027,9 @@ vm_expand_stack_inner (void *data_ptr) vp->stack_limit = vp->stack_bottom; reloc = vp->stack_top - old_top; - if (reloc) - { - union scm_vm_stack_element *fp; - if (vp->fp) - vp->fp += reloc; - data->new_sp += reloc; - fp = vp->fp; - while (fp) - { - union scm_vm_stack_element *next_fp = SCM_FRAME_DYNAMIC_LINK (fp); - if (next_fp) - { - next_fp += reloc; - SCM_FRAME_SET_DYNAMIC_LINK (fp, next_fp); - } - fp = next_fp; - } - } + if (vp->fp) + vp->fp += reloc; + data->new_sp += reloc; return new_bottom; }