mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-19 02:00:26 +02:00
Optimize make-stack
* libguile/continuations.h: * libguile/continuations.c (scm_i_continuation_to_frame): Operate on low-level C structures instead of heap objects. * libguile/frames.h: * libguile/frames.c (frame_offset, frame_stack_base): Const args. (scm_c_frame_closure): New helper. (scm_frame_procedure): Use the new helper. * libguile/stacks.c (stack_depth, narrow_stack, scm_make_stack): Rework to avoid allocating frames as we traverse the stack, and to avoid an n**2 case where there are outer cuts.
This commit is contained in:
parent
8de051da47
commit
3b14dd2f27
5 changed files with 103 additions and 80 deletions
|
@ -168,8 +168,8 @@ scm_i_make_continuation (int *first, struct scm_vm *vp, SCM vm_cont)
|
|||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
SCM
|
||||
scm_i_continuation_to_frame (SCM continuation)
|
||||
int
|
||||
scm_i_continuation_to_frame (SCM continuation, struct scm_frame *frame)
|
||||
{
|
||||
SCM contregs;
|
||||
scm_t_contregs *cont;
|
||||
|
@ -179,18 +179,17 @@ scm_i_continuation_to_frame (SCM continuation)
|
|||
|
||||
if (scm_is_true (cont->vm_cont))
|
||||
{
|
||||
struct scm_frame frame;
|
||||
struct scm_vm_cont *data = SCM_VM_CONT_DATA (cont->vm_cont);
|
||||
|
||||
frame.stack_holder = data;
|
||||
frame.fp_offset = (data->fp + data->reloc) - data->stack_base;
|
||||
frame.sp_offset = (data->sp + data->reloc) - data->stack_base;
|
||||
frame.ip = data->ra;
|
||||
frame->stack_holder = data;
|
||||
frame->fp_offset = (data->fp + data->reloc) - data->stack_base;
|
||||
frame->sp_offset = (data->sp + data->reloc) - data->stack_base;
|
||||
frame->ip = data->ra;
|
||||
|
||||
return scm_c_make_frame (SCM_VM_FRAME_KIND_CONT, &frame);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return SCM_BOOL_F;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct scm_vm *
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue