summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-02-25 13:17:34 +0100
committerAndy Wingo <wingo@pobox.com>2010-02-25 20:59:55 +0100
commitb8af64db76bc602517be300128be0dfb67fac89f (patch)
tree71175912af3a40c5f44a781fe8983e23a6081c61
parentda7fa082e80b2c3989c90031ee5356e5b65bd00b (diff)
downloadguile-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.c20
-rw-r--r--libguile/control.h2
-rw-r--r--libguile/eval.c15
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;
}