summaryrefslogtreecommitdiff
path: root/libguile/frames.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-11-21 17:21:37 +0100
committerAndy Wingo <wingo@pobox.com>2013-11-21 17:21:37 +0100
commit5515edc5f21e042ade15cf508300c496ce2f4818 (patch)
tree5b3158516c0c736474123f84593bbd56666369b7 /libguile/frames.c
parent050a40db5b0b09f0b00d4d68aac67827c7f9b1ac (diff)
downloadguile-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.c33
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