diff options
author | Andy Wingo <wingo@pobox.com> | 2010-02-25 13:17:34 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-02-25 20:59:55 +0100 |
commit | b8af64db76bc602517be300128be0dfb67fac89f (patch) | |
tree | 71175912af3a40c5f44a781fe8983e23a6081c61 | |
parent | da7fa082e80b2c3989c90031ee5356e5b65bd00b (diff) | |
download | guile-b8af64db76bc602517be300128be0dfb67fac89f.tar.gz |
simplify handling of nonlocal prompt returns from c
* libguile/control.h:
* libguile/control.c (scm_i_prompt_pop_abort_args_x): New helper.
* libguile/eval.c (eval): Use the new helper.
-rw-r--r-- | libguile/control.c | 20 | ||||
-rw-r--r-- | libguile/control.h | 2 | ||||
-rw-r--r-- | libguile/eval.c | 15 |
3 files changed, 24 insertions, 13 deletions
diff --git a/libguile/control.c b/libguile/control.c index 9f23f3098..5ca625254 100644 --- a/libguile/control.c +++ b/libguile/control.c @@ -57,6 +57,26 @@ scm_c_make_prompt (SCM vm, SCM k, scm_t_uint8 escape_only_p, return ret; } +/* Only to be called if the SCM_PROMPT_SETJMP returns 1 */ +SCM +scm_i_prompt_pop_abort_args_x (SCM prompt) +{ + size_t i, n; + SCM vals = SCM_EOL; + + n = scm_to_size_t (SCM_PROMPT_REGISTERS (prompt)->sp[0]); + for (i = 0; i < n; i++) + vals = scm_cons (SCM_PROMPT_REGISTERS (prompt)->sp[-(i + 1)], vals); + + /* The abort did reset the VM's registers, but then these values + were pushed on; so we need to pop them ourselves. */ + SCM_VM_DATA (scm_the_vm ())->sp -= n + 1; + /* FIXME NULLSTACK */ + + return vals; +} + + #ifdef WORDS_BIGENDIAN #define OBJCODE_HEADER(main,meta) 0, 0, 0, main, 0, 0, 0, meta+8 #define META_HEADER(meta) 0, 0, 0, meta, 0, 0, 0, 0 diff --git a/libguile/control.h b/libguile/control.h index 146e216bd..19e841eda 100644 --- a/libguile/control.h +++ b/libguile/control.h @@ -47,6 +47,8 @@ SCM_INTERNAL SCM scm_sys_default_prompt_tag; SCM_INTERNAL SCM scm_c_make_prompt (SCM vm, SCM k, scm_t_uint8 escape_only_p, scm_t_int64 cookie); +SCM_INTERNAL SCM scm_i_prompt_pop_abort_args_x (SCM prompt); + SCM_INTERNAL SCM scm_c_abort (SCM vm, SCM tag, size_t n, SCM *argv, scm_t_int64 cookie) SCM_NORETURN; SCM_INTERNAL SCM scm_at_abort (SCM tag, SCM args) SCM_NORETURN; diff --git a/libguile/eval.c b/libguile/eval.c index c82e5431d..dff0372a2 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -435,20 +435,9 @@ eval (SCM x, SCM env) if (SCM_PROMPT_SETJMP (prompt)) { - /* The prompt exited nonlocally. The args are on the VM stack. */ - size_t i, n; - SCM vals = SCM_EOL; - n = scm_to_size_t (SCM_PROMPT_REGISTERS (prompt)->sp[0]); - for (i = 0; i < n; i++) - vals = scm_cons (SCM_PROMPT_REGISTERS (prompt)->sp[-(i + 1)], vals); - /* The abort did reset the VM's registers, but then these values - were pushed on; so we need to pop them ourselves. */ - SCM_VM_DATA (scm_the_vm ())->sp -= n + 1; - /* FIXME NULLSTACK */ - - /* FIXME mark cont as non-reentrant */ + /* The prompt exited nonlocally. */ proc = handler; - args = vals; + args = scm_i_prompt_pop_abort_args_x (prompt); goto apply_proc; } |