mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Identify boot continuations by code, not closure
* libguile/vm.h: * libguile/vm.c (scm_i_vm_is_boot_continuation_code): New internal procedure. * libguile/stacks.c (scm_make_stack): * libguile/frames.c (scm_c_frame_previous): Use new helper to identify boot frames.
This commit is contained in:
parent
d729a0dc75
commit
02fc5a772b
4 changed files with 10 additions and 7 deletions
|
@ -388,11 +388,8 @@ scm_c_frame_previous (enum scm_vm_frame_kind kind, struct scm_frame *frame)
|
|||
frame->sp_offset = stack_top - new_sp;
|
||||
frame->ip = SCM_FRAME_RETURN_ADDRESS (this_fp);
|
||||
|
||||
{
|
||||
SCM proc = scm_c_frame_closure (kind, frame);
|
||||
if (SCM_PROGRAM_P (proc) && SCM_PROGRAM_IS_BOOT (proc))
|
||||
goto again;
|
||||
}
|
||||
if (scm_i_vm_is_boot_continuation_code (frame->ip))
|
||||
goto again;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -361,8 +361,7 @@ SCM_DEFINE (scm_make_stack, "make-stack", 1, 0, 1,
|
|||
|
||||
/* Skip initial boot frame, if any. This is possible if the frame
|
||||
originates from a captured continuation. */
|
||||
if (SCM_PROGRAM_P (scm_c_frame_closure (kind, &frame))
|
||||
&& SCM_PROGRAM_IS_BOOT (scm_c_frame_closure (kind, &frame))
|
||||
if (scm_i_vm_is_boot_continuation_code (frame.ip)
|
||||
&& !scm_c_frame_previous (kind, &frame))
|
||||
return SCM_BOOL_F;
|
||||
|
||||
|
|
|
@ -661,6 +661,12 @@ static const scm_t_uint32 vm_builtin_call_with_current_continuation_code[] = {
|
|||
};
|
||||
|
||||
|
||||
int
|
||||
scm_i_vm_is_boot_continuation_code (scm_t_uint32 *ip)
|
||||
{
|
||||
return ip == vm_boot_continuation_code;
|
||||
}
|
||||
|
||||
static SCM
|
||||
scm_vm_builtin_ref (unsigned idx)
|
||||
{
|
||||
|
|
|
@ -106,6 +106,7 @@ SCM_INTERNAL SCM scm_i_vm_capture_stack (union scm_vm_stack_element *stack_top,
|
|||
SCM_INTERNAL int scm_i_vm_cont_to_frame (SCM cont, struct scm_frame *frame);
|
||||
SCM_INTERNAL void scm_i_vm_cont_print (SCM x, SCM port,
|
||||
scm_print_state *pstate);
|
||||
SCM_INTERNAL int scm_i_vm_is_boot_continuation_code (scm_t_uint32 *ip);
|
||||
SCM_INTERNAL void scm_bootstrap_vm (void);
|
||||
SCM_INTERNAL void scm_init_vm (void);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue