summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/continuations.c2
-rw-r--r--libguile/frames.c10
-rw-r--r--libguile/frames.h10
-rw-r--r--libguile/stacks.c2
-rw-r--r--libguile/vm.c2
5 files changed, 18 insertions, 8 deletions
diff --git a/libguile/continuations.c b/libguile/continuations.c
index 7c40dbfe3..31e36441a 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 (cont->vm_cont,
+ return scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, cont->vm_cont,
(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 0fc0b9ec1..824f2c84e 100644
--- a/libguile/frames.c
+++ b/libguile/frames.c
@@ -37,8 +37,9 @@ verify (offsetof (struct scm_vm_frame, dynamic_link) == 0);
(((SCM *) (val)) + SCM_VM_FRAME_OFFSET (frame))
SCM
-scm_c_make_frame (SCM stack_holder, scm_t_ptrdiff fp_offset,
- scm_t_ptrdiff sp_offset, scm_t_uint32 *ip)
+scm_c_make_frame (enum scm_vm_frame_kind frame_kind, SCM stack_holder,
+ scm_t_ptrdiff fp_offset, scm_t_ptrdiff sp_offset,
+ scm_t_uint32 *ip)
{
struct scm_frame *p = scm_gc_malloc (sizeof (struct scm_frame),
"vmframe");
@@ -46,7 +47,7 @@ scm_c_make_frame (SCM stack_holder, scm_t_ptrdiff fp_offset,
p->fp_offset = fp_offset;
p->sp_offset = sp_offset;
p->ip = ip;
- return scm_cell (scm_tc7_frame, (scm_t_bits)p);
+ return scm_cell (scm_tc7_frame | (frame_kind << 8), (scm_t_bits)p);
}
void
@@ -282,7 +283,8 @@ SCM_DEFINE (scm_frame_previous, "frame-previous", 1, 0, 0,
SCM *stack_base = scm_i_frame_stack_base (frame);
new_fp = RELOC (frame, new_fp);
new_sp = SCM_FRAME_PREVIOUS_SP (this_fp);
- frame = scm_c_make_frame (SCM_VM_FRAME_STACK_HOLDER (frame),
+ frame = scm_c_make_frame (SCM_VM_FRAME_KIND (frame),
+ SCM_VM_FRAME_STACK_HOLDER (frame),
new_fp - stack_base, new_sp - stack_base,
SCM_FRAME_RETURN_ADDRESS (this_fp));
proc = scm_frame_procedure (frame);
diff --git a/libguile/frames.h b/libguile/frames.h
index 3876c2fc4..67130ad61 100644
--- a/libguile/frames.h
+++ b/libguile/frames.h
@@ -146,7 +146,14 @@ struct scm_frame
scm_t_uint32 *ip;
};
+enum scm_vm_frame_kind
+ {
+ SCM_VM_FRAME_KIND_VM,
+ SCM_VM_FRAME_KIND_CONT
+ };
+
#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_STACK_HOLDER(f) SCM_VM_FRAME_DATA (f)->stack_holder
#define SCM_VM_FRAME_FP_OFFSET(f) SCM_VM_FRAME_DATA (f)->fp_offset
@@ -160,7 +167,8 @@ struct scm_frame
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 (SCM stack_holder, scm_t_ptrdiff fp_offset,
+SCM_INTERNAL SCM scm_c_make_frame (enum scm_vm_frame_kind vm_frame_kind,
+ SCM 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 97b1495b8..c478b06e2 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 (cont,
+ frame = scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, cont,
(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 65e822b26..afb5c4281 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -211,7 +211,7 @@ vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n)
frame = alloca (sizeof (*frame) + 8);
frame = (scm_t_cell *) ROUND_UP ((scm_t_uintptr) frame, 8UL);
- frame->word_0 = SCM_PACK (scm_tc7_frame);
+ frame->word_0 = SCM_PACK (scm_tc7_frame | (SCM_VM_FRAME_KIND_VM << 8));
frame->word_1 = SCM_PACK_POINTER (&c_frame);
if (n == 0)