diff options
author | Andy Wingo <wingo@pobox.com> | 2012-03-07 10:27:16 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2012-03-07 10:27:16 +0100 |
commit | 9d381ba4788b4d447acd3238c2fc8b86da4998b2 (patch) | |
tree | 5fd37ed1b9d73a20dbfadce6c4681bba8f05c75e /libguile/dynstack.h | |
parent | 3c12fc359561aedb179a524667ba03481333f482 (diff) | |
download | guile-9d381ba4788b4d447acd3238c2fc8b86da4998b2.tar.gz |
dynstack: pushing a prompt no longer allocates memory
* libguile/control.h: Remove scm_t_prompt_registers and
scm_c_make_prompt_registers.
(scm_c_abort): Take a pointer to a jmpbuf instead of a cookie. It
will serve the same purpose.
* libguile/control.c (reify_partial_continuation, scm_at_abort): Adapt
to new prompt representation.
* libguile/dynstack.h:
* libguile/dynstack.c (scm_dynstack_push_prompt): Prompts now have 5
words instead of 2, as they now push the fp, sp, ip, and jmpbuf on the
stack separately. This avoids allocation.
(scm_dynstack_find_prompt): Likewise, add return values for fp, sp,
etc.
(scm_dynstack_wind_prompt): Replaces scm_dynstack_relocate_prompt.
* libguile/eval.c (eval):
* libguile/stacks.c (find_prompt):
* libguile/throw.c (pre_init_catch): Adapt to the new prompt mechanism.
* libguile/vm-engine.c (vm_engine): Setjmp an on-stack jmpbuf every time
the VM enters. We can then re-use that jmpbuf for all prompts in that
invocation.
* libguile/vm-i-system.c (partial_cont_call): Adapt to change in prompt
representation. We don't need to wind here any more, since we pass in
the prompt's jmpbuf.
(prompt): Adapt to scm_dynstack_push_prompt change.
(abort): Adapt to vm_abort change.
* libguile/vm.h (struct scm_vm): No more cookie.
* libguile/vm.c (vm_abort): Adapt to scm_c_abort change.
(vm_reinstate_partial_continuation): Rewind the dynamic stack here,
now that we do have a valid jmpbuf.
(make_vm): No need to initialize a cookie.
Diffstat (limited to 'libguile/dynstack.h')
-rw-r--r-- | libguile/dynstack.h | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/libguile/dynstack.h b/libguile/dynstack.h index 33389cad7..207638ec7 100644 --- a/libguile/dynstack.h +++ b/libguile/dynstack.h @@ -156,7 +156,8 @@ SCM_INTERNAL void scm_dynstack_push_fluids (scm_t_dynstack *, SCM_INTERNAL void scm_dynstack_push_prompt (scm_t_dynstack *, scm_t_dynstack_prompt_flags, SCM key, - scm_t_prompt_registers *); + SCM *fp, SCM *sp, scm_t_uint8 *ip, + scm_i_jmp_buf *registers); SCM_INTERNAL void scm_dynstack_push_dynwind (scm_t_dynstack *, SCM enter, SCM leave); @@ -177,6 +178,11 @@ SCM_INTERNAL scm_t_bits scm_dynstack_unwind_1 (scm_t_dynstack *); SCM_INTERNAL void scm_dynstack_wind (scm_t_dynstack *, scm_t_bits *); SCM_INTERNAL void scm_dynstack_unwind (scm_t_dynstack *, scm_t_bits *); + + + +/* Miscellany. */ + SCM_INTERNAL scm_t_bits* scm_dynstack_unwind_fork (scm_t_dynstack *, scm_t_dynstack *); @@ -184,17 +190,13 @@ SCM_INTERNAL void scm_dynstack_unwind_frame (scm_t_dynstack *); SCM_INTERNAL void scm_dynstack_unwind_fluids (scm_t_dynstack *dynstack, SCM dynamic_state); - - - -/* Miscellany. */ - SCM_INTERNAL scm_t_bits* scm_dynstack_find_prompt (scm_t_dynstack *, SCM, - scm_t_prompt_registers **, - scm_t_dynstack_prompt_flags *); + scm_t_dynstack_prompt_flags *, + SCM **, SCM **, scm_t_uint8 **, + scm_i_jmp_buf **); -SCM_INTERNAL scm_t_prompt_registers* -scm_dynstack_relocate_prompt (scm_t_dynstack *, scm_t_ptrdiff, scm_t_uint64); +SCM_INTERNAL void scm_dynstack_wind_prompt (scm_t_dynstack *, scm_t_bits *, + scm_t_ptrdiff, scm_i_jmp_buf *); #endif /* SCM_DYNSTACK_H */ |