diff options
author | Andy Wingo <wingo@pobox.com> | 2014-02-20 09:45:01 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-02-20 09:45:01 +0100 |
commit | 7e2fd4e7f53c281307efd12b80df46346002a33d (patch) | |
tree | 324241c65afa58b0b1f75600716b69e932bd4334 /libguile/stackchk.c | |
parent | 5d20fd49fe53c2520e36e8bf983c7b7214b0ad2a (diff) | |
download | guile-7e2fd4e7f53c281307efd12b80df46346002a33d.tar.gz |
Unwind-only stack overflow exceptions
* module/ice-9/boot-9.scm (catch): Signal an early error if the handler
or pre-unwind handler types aren't right. This is more important than
it was, given that we dispatch on type now when finding matching catch
clauses.
* libguile/vm.c (vm_expand_stack): Use the standard
scm_report_stack_overflow to signal stack overflow. This will avoid
running pre-unwind handlers.
* libguile/throw.h: Move scm_report_stack_overflow here.
* libguile/throw.c (catch): Define a version of catch in C.
(throw_without_pre_unwind): New helper. Besides serving as the
pre-boot "throw" binding, it allows stack overflow to throw without
running pre-unwind handlers.
(scm_catch, scm_catch_with_pre_unwind_handler)
(scm_with_throw_handler): Use the new catch in C.
(scm_report_stack_overflow): Moved from stackchk.c; throws an
unwind-only exception.
* libguile/stackchk.h:
* libguile/stackchk.c: Remove the scm_report_stack_overflow bits.
Diffstat (limited to 'libguile/stackchk.c')
-rw-r--r-- | libguile/stackchk.c | 24 |
1 files changed, 1 insertions, 23 deletions
diff --git a/libguile/stackchk.c b/libguile/stackchk.c index 208ba97ed..7e2441b53 100644 --- a/libguile/stackchk.c +++ b/libguile/stackchk.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997, 2000, 2001, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997, 2000, 2001, 2006, 2008, 2010, 2011, 2014 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 License @@ -36,34 +36,12 @@ int scm_stack_checking_enabled_p; -SCM_SYMBOL (scm_stack_overflow_key, "stack-overflow"); - static void reset_scm_stack_checking_enabled_p (void *arg) { scm_stack_checking_enabled_p = (int)(scm_t_bits)arg; } -void -scm_report_stack_overflow () -{ - scm_dynwind_begin (0); /* non-rewindable frame */ - scm_dynwind_unwind_handler (reset_scm_stack_checking_enabled_p, - (void*)(scm_t_bits)scm_stack_checking_enabled_p, - SCM_F_WIND_EXPLICITLY); - - scm_stack_checking_enabled_p = 0; - - scm_error (scm_stack_overflow_key, - NULL, - "Stack overflow", - SCM_BOOL_F, - SCM_BOOL_F); - - /* not reached */ - scm_dynwind_end (); -} - long scm_stack_size (SCM_STACKITEM *start) { |