summaryrefslogtreecommitdiff
path: root/testsuite/t-catch.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-08-11 18:35:58 +0200
committerAndy Wingo <wingo@pobox.com>2008-08-11 18:35:58 +0200
commit7e4760e4133160e24cc15dba17cdeac3040eb080 (patch)
tree088db6283f78a51781bcd1ee4570bc7ca852c4d5 /testsuite/t-catch.scm
parent67c4505e7a1002d8bbb395d3d4d79e77250f737e (diff)
downloadguile-7e4760e4133160e24cc15dba17cdeac3040eb080.tar.gz
fix bug in compilation of `and' and `or'; more robust underflow detection.
* module/system/il/compile.scm (codegen): Rewrite handling of `and' and `or' ghil compilation, because it was broken if drop was #t. Tricky bug, this one! Took me days to track down! * module/system/repl/repl.scm: Export call-with-backtrace, which probably should go in some other file. * src/vm.c (scm_vm_save_stack): Handle the fp==0 case for errors before we have a frame. * src/vm_engine.h (NEW_FRAME, FREE_FRAME): Stricter underflow checking, raising the stack base to the return address, in an attempt to prevent inadvertant stack smashing (the symptom of the and/or miscompilation bug). (CHECK_IP): A check that the current IP is within the bounds of the current program. Not normally compiled in. Perhaps it should be? * src/vm_system.c (halt): Set vp->ip to NULL. Paranoia, I know. (return): Call CHECK_IP(), if such a thing is compiled in. * testsuite/Makefile.am (vm_test_files): * testsuite/t-catch.scm: * testsuite/t-map.scm: * testsuite/t-or.scm: New tests.
Diffstat (limited to 'testsuite/t-catch.scm')
-rw-r--r--testsuite/t-catch.scm10
1 files changed, 10 insertions, 0 deletions
diff --git a/testsuite/t-catch.scm b/testsuite/t-catch.scm
new file mode 100644
index 000000000..9cc3e0e14
--- /dev/null
+++ b/testsuite/t-catch.scm
@@ -0,0 +1,10 @@
+;; Test that nonlocal exits of the VM work.
+
+(begin
+ (define (foo thunk)
+ (catch #t thunk (lambda args args)))
+ (foo
+ (lambda ()
+ (let ((a 'one))
+ (1+ a)))))
+