diff options
author | Andy Wingo <wingo@pobox.com> | 2013-11-21 17:21:37 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-11-21 17:21:37 +0100 |
commit | 5515edc5f21e042ade15cf508300c496ce2f4818 (patch) | |
tree | 5b3158516c0c736474123f84593bbd56666369b7 /libguile/frames.c | |
parent | 050a40db5b0b09f0b00d4d68aac67827c7f9b1ac (diff) | |
download | guile-5515edc5f21e042ade15cf508300c496ce2f4818.tar.gz |
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.
Diffstat (limited to 'libguile/frames.c')
-rw-r--r-- | libguile/frames.c | 33 |
1 files changed, 23 insertions, 10 deletions
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 |