mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 23:50:19 +02:00
expose frame-previous, once again
* libguile/frames.h: * libguile/frames.c (scm_frame_previous): Rename from scm_c_frame_prev, and expose to Scheme. Skip boot frames. * libguile/stacks.c (stack_depth, narrow_stack, scm_make_stack) (scm_stack_ref): Adjust for scm_frame_previous skipping boot frames.
This commit is contained in:
parent
5b98517a65
commit
93dbc31b9a
3 changed files with 28 additions and 18 deletions
|
@ -264,23 +264,34 @@ SCM_DEFINE (scm_frame_dynamic_link, "frame-dynamic-link", 1, 0, 0,
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
extern SCM
|
SCM_DEFINE (scm_frame_previous, "frame-previous", 1, 0, 0,
|
||||||
scm_c_frame_prev (SCM frame)
|
(SCM frame),
|
||||||
|
"")
|
||||||
|
#define FUNC_NAME s_scm_frame_previous
|
||||||
{
|
{
|
||||||
SCM *this_fp, *new_fp, *new_sp;
|
SCM *this_fp, *new_fp, *new_sp;
|
||||||
|
|
||||||
|
SCM_VALIDATE_VM_FRAME (1, frame);
|
||||||
|
|
||||||
|
again:
|
||||||
this_fp = SCM_VM_FRAME_FP (frame);
|
this_fp = SCM_VM_FRAME_FP (frame);
|
||||||
new_fp = SCM_FRAME_DYNAMIC_LINK (this_fp);
|
new_fp = SCM_FRAME_DYNAMIC_LINK (this_fp);
|
||||||
if (new_fp)
|
if (new_fp)
|
||||||
{ new_fp = RELOC (frame, new_fp);
|
{ new_fp = RELOC (frame, new_fp);
|
||||||
new_sp = SCM_FRAME_LOWER_ADDRESS (this_fp) - 1;
|
new_sp = SCM_FRAME_LOWER_ADDRESS (this_fp) - 1;
|
||||||
return scm_c_make_frame (SCM_VM_FRAME_STACK_HOLDER (frame),
|
frame = scm_c_make_frame (SCM_VM_FRAME_STACK_HOLDER (frame),
|
||||||
new_fp, new_sp,
|
new_fp, new_sp,
|
||||||
SCM_FRAME_RETURN_ADDRESS (this_fp),
|
SCM_FRAME_RETURN_ADDRESS (this_fp),
|
||||||
SCM_VM_FRAME_OFFSET (frame));
|
SCM_VM_FRAME_OFFSET (frame));
|
||||||
|
if (SCM_PROGRAM_IS_BOOT (scm_frame_procedure (frame)))
|
||||||
|
goto again;
|
||||||
|
else
|
||||||
|
return frame;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return SCM_BOOL_F;
|
return SCM_BOOL_F;
|
||||||
}
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -120,8 +120,7 @@ SCM_API SCM scm_frame_instruction_pointer (SCM frame);
|
||||||
SCM_API SCM scm_frame_return_address (SCM frame);
|
SCM_API SCM scm_frame_return_address (SCM frame);
|
||||||
SCM_API SCM scm_frame_mv_return_address (SCM frame);
|
SCM_API SCM scm_frame_mv_return_address (SCM frame);
|
||||||
SCM_API SCM scm_frame_dynamic_link (SCM frame);
|
SCM_API SCM scm_frame_dynamic_link (SCM frame);
|
||||||
|
SCM_API SCM scm_frame_previous (SCM frame);
|
||||||
SCM_API SCM scm_c_frame_prev (SCM frame);
|
|
||||||
|
|
||||||
SCM_INTERNAL void scm_bootstrap_frames (void);
|
SCM_INTERNAL void scm_bootstrap_frames (void);
|
||||||
SCM_INTERNAL void scm_init_frames (void);
|
SCM_INTERNAL void scm_init_frames (void);
|
||||||
|
|
|
@ -69,9 +69,8 @@ stack_depth (SCM frame, SCM *fp)
|
||||||
long n;
|
long n;
|
||||||
/* count frames, skipping boot frames */
|
/* count frames, skipping boot frames */
|
||||||
for (; scm_is_true (frame) && SCM_VM_FRAME_FP (frame) > fp;
|
for (; scm_is_true (frame) && SCM_VM_FRAME_FP (frame) > fp;
|
||||||
frame = scm_c_frame_prev (frame))
|
frame = scm_frame_previous (frame))
|
||||||
if (!SCM_PROGRAM_IS_BOOT (scm_frame_procedure (frame)))
|
++n;
|
||||||
++n;
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +111,7 @@ narrow_stack (SCM stack, long inner, SCM inner_key, long outer, SCM outer_key)
|
||||||
for (; inner && len; --inner)
|
for (; inner && len; --inner)
|
||||||
{
|
{
|
||||||
len--;
|
len--;
|
||||||
frame = scm_c_frame_prev (frame);
|
frame = scm_frame_previous (frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -122,7 +121,7 @@ narrow_stack (SCM stack, long inner, SCM inner_key, long outer, SCM outer_key)
|
||||||
{
|
{
|
||||||
SCM proc = scm_frame_procedure (frame);
|
SCM proc = scm_frame_procedure (frame);
|
||||||
len--;
|
len--;
|
||||||
frame = scm_c_frame_prev (frame);
|
frame = scm_frame_previous (frame);
|
||||||
if (scm_is_eq (proc, inner_key))
|
if (scm_is_eq (proc, inner_key))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -231,6 +230,11 @@ SCM_DEFINE (scm_make_stack, "make-stack", 1, 0, 1,
|
||||||
/* not reached */
|
/* not reached */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: is this even possible? */
|
||||||
|
if (scm_is_true (frame)
|
||||||
|
&& SCM_PROGRAM_IS_BOOT (scm_frame_procedure (frame)))
|
||||||
|
frame = scm_frame_previous (frame);
|
||||||
|
|
||||||
if (scm_is_false (frame))
|
if (scm_is_false (frame))
|
||||||
return SCM_BOOL_F;
|
return SCM_BOOL_F;
|
||||||
|
|
||||||
|
@ -351,11 +355,7 @@ SCM_DEFINE (scm_stack_ref, "stack-ref", 2, 0, 0,
|
||||||
c_index = scm_to_unsigned_integer (index, 0, SCM_STACK_LENGTH(stack)-1);
|
c_index = scm_to_unsigned_integer (index, 0, SCM_STACK_LENGTH(stack)-1);
|
||||||
frame = SCM_STACK_FRAME (stack);
|
frame = SCM_STACK_FRAME (stack);
|
||||||
while (c_index--)
|
while (c_index--)
|
||||||
{
|
frame = scm_frame_previous (frame);
|
||||||
frame = scm_c_frame_prev (frame);
|
|
||||||
while (SCM_PROGRAM_IS_BOOT (scm_frame_procedure (frame)))
|
|
||||||
frame = scm_c_frame_prev (frame);
|
|
||||||
}
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue