summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-10-14 17:32:16 +0200
committerAndy Wingo <wingo@pobox.com>2013-10-14 17:32:16 +0200
commit99511cd0abfa0bde4440b2781740f18f49248a99 (patch)
tree6fc8acd3aad9fbf731d5b4499dab00b960149935
parent5bd4b6585b3733077d0a36265ce057611836e163 (diff)
downloadguile-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.c10
-rw-r--r--libguile/vm.c27
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, &registers);
+ SYNC_REGISTER ();
+ tail = sp[0];
+ stack_args = sp - n;
+ tag = sp[-(n + 1)];
+ vm_abort (vm, tag, n, stack_args, tail, sp - (n + 2), &registers);
/* 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