diff options
author | Andy Wingo <wingo@pobox.com> | 2011-03-24 20:20:14 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-03-24 20:20:18 +0100 |
commit | ecba00af6501e082b86c8f2f7730081c733509d7 (patch) | |
tree | 9a5729bf4c53e374fb3a6e83d5aa76f690143b60 | |
parent | ad301b6d58c2ca054ebe1fdfaf7357e61311a977 (diff) | |
download | guile-ecba00af6501e082b86c8f2f7730081c733509d7.tar.gz |
with-continuation-barrier carps, calls exit(3) _after_ unwinding
* libguile/continuations.c (scm_handler, c_handler)
(scm_c_with_continuation_barrier, scm_with_continuation_barrier): Call
scm_handle_by_message_noexit in the post-unwind handler, so that
dynwinds
* test-suite/tests/continuations.test ("continuations"): Add a test.
-rw-r--r-- | libguile/continuations.c | 16 | ||||
-rw-r--r-- | test-suite/tests/continuations.test | 13 |
2 files changed, 25 insertions, 4 deletions
diff --git a/libguile/continuations.c b/libguile/continuations.c index dc6850e05..28b6236c7 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -477,7 +477,13 @@ c_body (void *d) static SCM c_handler (void *d, SCM tag, SCM args) { - struct c_data *data = (struct c_data *)d; + struct c_data *data; + + /* Print a message. Note that if TAG is `quit', this will exit() the + process. */ + scm_handle_by_message_noexit (NULL, tag, args); + + data = (struct c_data *)d; data->result = NULL; return SCM_UNSPECIFIED; } @@ -490,7 +496,7 @@ scm_c_with_continuation_barrier (void *(*func) (void *), void *data) c_data.data = data; scm_i_with_continuation_barrier (c_body, &c_data, c_handler, &c_data, - scm_handle_by_message_noexit, NULL); + NULL, NULL); return c_data.result; } @@ -508,6 +514,10 @@ scm_body (void *d) static SCM scm_handler (void *d, SCM tag, SCM args) { + /* Print a message. Note that if TAG is `quit', this will exit() the + process. */ + scm_handle_by_message_noexit (NULL, tag, args); + return SCM_BOOL_F; } @@ -529,7 +539,7 @@ SCM_DEFINE (scm_with_continuation_barrier, "with-continuation-barrier", 1,0,0, scm_data.proc = proc; return scm_i_with_continuation_barrier (scm_body, &scm_data, scm_handler, &scm_data, - scm_handle_by_message_noexit, NULL); + NULL, NULL); } #undef FUNC_NAME diff --git a/test-suite/tests/continuations.test b/test-suite/tests/continuations.test index f6db40e58..a436b90d4 100644 --- a/test-suite/tests/continuations.test +++ b/test-suite/tests/continuations.test @@ -1,7 +1,7 @@ ;;;; -*- scheme -*- ;;;; continuations.test --- test suite for continutations ;;;; -;;;; Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc. +;;;; Copyright (C) 2003, 2006, 2009, 2011 Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -80,6 +80,17 @@ (error "Catch me if you can!"))))))))) handled)) + (pass-if "exit unwinds dynwinds inside a continuation barrier" + (let ((s (with-error-to-string + (lambda () + (with-continuation-barrier + (lambda () + (dynamic-wind + (lambda () #f) + (lambda () (exit 1)) + (lambda () (throw 'abcde))))))))) + (and (string-contains s "abcde") #t))) + (with-debugging-evaluator (pass-if "make a stack from a continuation" |