diff options
author | Andy Wingo <wingo@pobox.com> | 2008-10-16 13:24:39 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2008-10-16 13:24:39 +0200 |
commit | 1f40459f5cd2389d0a44b6c46d431ed58f450f3a (patch) | |
tree | 0de6be1a41b25c4652c0372f8b25b6920a1cffac /libguile/vm-engine.h | |
parent | 28a2f57bde42030e96b4c2ab574336c6e8c394b5 (diff) | |
download | guile-1f40459f5cd2389d0a44b6c46d431ed58f450f3a.tar.gz |
ensure that lists pushed onto the stack are proper
I saw this problem when running elisp.test -- it tries to apply a
function to an arglist ending in nil, which obviously is not null.
* libguile/vm-engine.h (PUSH_LIST): New helper macro, pushes the elements
of a list onto the stack. Checks to make sure that the list is proper.
* libguile/vm-i-system.c (list-break, mv-call, apply, goto/apply)
(goto/cc): Use LIST_BREAK.
* libguile/vm-engine.c (vm_error_improper_list): New error case.
Diffstat (limited to 'libguile/vm-engine.h')
-rw-r--r-- | libguile/vm-engine.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h index 22a7ef5e4..215f630b1 100644 --- a/libguile/vm-engine.h +++ b/libguile/vm-engine.h @@ -299,6 +299,18 @@ do \ PUSH (l); \ } while (0) +/* The opposite: push all of the elements in L onto the list. */ +#define PUSH_LIST(l) \ +do \ +{ \ + for (; scm_is_pair (l); l = SCM_CDR (l)) \ + PUSH (SCM_CAR (l)); \ + if (SCM_UNLIKELY (!SCM_NULLP (l))) { \ + err_args = scm_list_1 (l); \ + goto vm_error_improper_list; \ + } \ +} while (0) + /* Below is a (slightly broken) experiment to avoid calling `scm_cell' and to allocate cells on the stack. This is a significant improvement for |