diff options
author | Andy Wingo <wingo@pobox.com> | 2013-10-14 17:32:16 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-10-14 17:32:16 +0200 |
commit | 99511cd0abfa0bde4440b2781740f18f49248a99 (patch) | |
tree | 6fc8acd3aad9fbf731d5b4499dab00b960149935 | |
parent | 5bd4b6585b3733077d0a36265ce057611836e163 (diff) | |
download | guile-99511cd0abfa0bde4440b2781740f18f49248a99.tar.gz |
Refactor vm_abort
* libguile/vm.c (vm_abort):
* libguile/vm-i-system.c (abort): Refactor abort interface so that it is
more amenable to the RTL VM.
-rw-r--r-- | libguile/vm-i-system.c | 10 | ||||
-rw-r--r-- | libguile/vm.c | 27 |
2 files changed, 20 insertions, 17 deletions
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 83e07f1ff..8df56de49 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -1475,10 +1475,14 @@ VM_DEFINE_INSTRUCTION (88, wind, "wind", 0, 2, 0) VM_DEFINE_INSTRUCTION (89, abort, "abort", 1, -1, -1) { - unsigned n = FETCH (); - SYNC_REGISTER (); + ptrdiff_t n = FETCH (); + SCM tag, *stack_args, tail; PRE_CHECK_UNDERFLOW (n + 2); - vm_abort (vm, n, ®isters); + SYNC_REGISTER (); + tail = sp[0]; + stack_args = sp - n; + tag = sp[-(n + 1)]; + vm_abort (vm, tag, n, stack_args, tail, sp - (n + 2), ®isters); /* vm_abort should not return */ abort (); } diff --git a/libguile/vm.c b/libguile/vm.c index 3a2795b7e..15a992ab5 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -273,33 +273,32 @@ vm_dispatch_hook (SCM vm, int hook_num, SCM *argv, int n) } static void -vm_abort (SCM vm, size_t n, scm_i_jmp_buf *current_registers) SCM_NORETURN; +vm_abort (SCM vm, SCM tag, size_t nstack, SCM *stack_args, SCM tail, SCM *sp, + scm_i_jmp_buf *current_registers) SCM_NORETURN; static void -vm_abort (SCM vm, size_t n, scm_i_jmp_buf *current_registers) +vm_abort (SCM vm, SCM tag, size_t nstack, SCM *stack_args, SCM tail, SCM *sp, + scm_i_jmp_buf *current_registers) { size_t i; ssize_t tail_len; - SCM tag, tail, *argv; + SCM *argv; - /* FIXME: VM_ENABLE_STACK_NULLING */ - tail = *(SCM_VM_DATA (vm)->sp--); - /* NULLSTACK (1) */ tail_len = scm_ilength (tail); if (tail_len < 0) scm_misc_error ("vm-engine", "tail values to abort should be a list", scm_list_1 (tail)); - tag = SCM_VM_DATA (vm)->sp[-n]; - argv = alloca ((n + tail_len) * sizeof (SCM)); - for (i = 0; i < n; i++) - argv[i] = SCM_VM_DATA (vm)->sp[-(n-1-i)]; - for (; i < n + tail_len; i++, tail = scm_cdr (tail)) + argv = alloca ((nstack + tail_len) * sizeof (SCM)); + for (i = 0; i < nstack; i++) + argv[i] = stack_args[i]; + for (; i < nstack + tail_len; i++, tail = scm_cdr (tail)) argv[i] = scm_car (tail); - /* NULLSTACK (n + 1) */ - SCM_VM_DATA (vm)->sp -= n + 1; - scm_c_abort (vm, tag, n + tail_len, argv, current_registers); + /* FIXME: NULLSTACK (SCM_VM_DATA (vp)->sp - sp) */ + SCM_VM_DATA (vm)->sp = sp; + + scm_c_abort (vm, tag, nstack + tail_len, argv, current_registers); } static void |