Mercurial > octave
annotate liboctave/cruft/misc/quit.h @ 20535:b70cc4bd8109
begin removal of global error_state variable
* gripes.h, gripes.cc (gripe_library_execution_error): Delete.
* error.cc (warning_state): Delete unused variable.
(reset_error_handler): Don't set warning_state or error_state.
(debug_or_throw_exception): New static function.
(verror): Don't check error_state.
(vmessage): Call debug_or_throw_exception instead of setting
error_state.
(error_1, error_2): Combine into single function, error_1 that prints
error message and ultimately calls debug_or_throw_exception.
(verror, verror_with_cfn, verror_with_id_cfn): Call error_1. Don't
check or set warning_state.
(error): Don't check error_state.
(Flasterror, Flasterr): Adapt to not using error_state.
(interpreter_try): Don't unwind_protect error_state.
* NEWS: Update.
* doc/interpreter/external.txi: Explain octave_execution_exception
instead of error_state for matrix addition example.
* jit-typeinfo.cc (octave_jit_gripe_nan_to_logical_conversion,
octave_jit_ginvalid_index, octave_jit_gindex_range,
octave_jit_paren_scalar, octave_jit_paren_scalar_subsasgn):
Don't catch octave_execution_exception.
* cellfun.cc (Fcellfun): Use exceptions instead of error_state.
* ls-mat-ascii.cc (save_mat_ascii_data): Likewise.
* mex.cc (mexCallMATLAB, mexEvalString): Likewise.
* variables.cc (safe_symbol_lookup): Likewise.
* svd.cc (Fsvd): Eliminate use of error_state.
* __magick_read__.cc (read_file, write_file): Likewise.
* variables.cc (generate_struct_completions): Eliminate use of
obsolete warning_state variable.
* ov-builtin.cc (octave_builtin::do_multi_index_op): Don't catch
octave_execution_exception and call gripe_library_execution_error.
* ov-class.cc (octave_class::reconstruct_exemplar): Eliminate use of
error_state. Catch possible octave_execution_exception in
do_multi_index_op.
* ov-mex-fcn.cc (octave_mex_function::do_multi_index_op): Eliminate
use of error_state. Catch possible octave_execution_exception in
call_mex.
* ov-fcn-handle.cc (octave_fcn_binder::maybe_binder): Eliminate use of
error_state.
* ov-oncleanup.cc (octave_oncleanup::~octave_oncleanup): Eliminate use
of error_state. Propagate possible octave_execution_exception from
do_multi_index_op.
* ov.cc (octave_value::assign, do_binary_op, do_unary_op,
octave_value::do_non_const_unary_op): Don't catch
octave_execution_exception here.
* oct-parse.in.yy (octave_base_parser::finish_colon_expression,
octave_base_parser::finish_array_list): Eliminate use of warning_state
and error_state.
(Feval, Fevalin): Use exceptions instead of error_state.
* pt-eval.cc, pt-eval.h (tree_evaluator::unwind_protect_exception):
New static variable.
* (tree_evaluator::visit_statement): Don't catch
octave_execution_exception here.
(tree_evaluator::visit_try_catch_command,
tree_evaluator::do_unwind_protect_cleanup): Eliminate use of error_state.
(tree_evaluator::visit_unwind_protect_command): Use
unwind_protect_exception to track whether an exception has occurred in
the try block.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 01 Oct 2015 16:18:19 -0400 |
parents | 4197fc428c7d |
children | e0e2c2ce7e94 |
rev | line source |
---|---|
4153 | 1 /* |
2 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19082
diff
changeset
|
3 Copyright (C) 2002-2015 John W. Eaton |
4153 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
4153 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
4153 | 20 |
21 */ | |
22 | |
23 #if !defined (octave_quit_h) | |
24 #define octave_quit_h 1 | |
25 | |
19082
96df707c7dad
Do not include system header files in extern "C" block (bug #43171)
Johannes Zarl <johannes.zarl@jku.at>
parents:
17744
diff
changeset
|
26 #include <stdio.h> |
96df707c7dad
Do not include system header files in extern "C" block (bug #43171)
Johannes Zarl <johannes.zarl@jku.at>
parents:
17744
diff
changeset
|
27 |
96df707c7dad
Do not include system header files in extern "C" block (bug #43171)
Johannes Zarl <johannes.zarl@jku.at>
parents:
17744
diff
changeset
|
28 #include <signal.h> |
96df707c7dad
Do not include system header files in extern "C" block (bug #43171)
Johannes Zarl <johannes.zarl@jku.at>
parents:
17744
diff
changeset
|
29 #include <setjmp.h> |
96df707c7dad
Do not include system header files in extern "C" block (bug #43171)
Johannes Zarl <johannes.zarl@jku.at>
parents:
17744
diff
changeset
|
30 |
4153 | 31 #ifdef __cplusplus |
4268 | 32 #include <new> |
4153 | 33 extern "C" { |
34 #endif | |
35 | |
5451 | 36 #if defined (__WIN32__) && ! defined (_POSIX_VERSION) |
37 | |
10346
65d5776379c3
Reduce the amount of stuff included by windows.h and avoid min/max being #define-d
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10142
diff
changeset
|
38 #define WIN32_LEAN_AND_MEAN |
5451 | 39 #include <windows.h> |
40 | |
6107 | 41 CRUFT_API extern void w32_sigint_init (void); /* setup */ |
42 CRUFT_API extern void w32_raise_final (void); /* tear down */ | |
43 CRUFT_API extern void w32_raise (int sig); /* raise signal in main thread */ | |
44 CRUFT_API extern int w32_in_main_thread (void); /* return true if in main thread */ | |
5451 | 45 |
46 #endif | |
47 | |
4180 | 48 #if defined (OCTAVE_HAVE_SIG_JUMP) |
49 | |
50 typedef sigjmp_buf octave_jmp_buf; | |
51 | |
52 #define octave_set_current_context sigsetjmp (current_context, 1) | |
53 | |
54 #else | |
55 | |
56 typedef jmp_buf octave_jmp_buf; | |
57 | |
58 #define octave_set_current_context setjmp (current_context) | |
59 | |
60 #endif | |
61 | |
6107 | 62 CRUFT_API extern octave_jmp_buf current_context; |
4153 | 63 |
6107 | 64 CRUFT_API extern void octave_save_current_context (void *); |
4153 | 65 |
6107 | 66 CRUFT_API extern void octave_restore_current_context (void *); |
4153 | 67 |
6107 | 68 CRUFT_API extern void octave_jump_to_enclosing_context (void) GCC_ATTR_NORETURN; |
4153 | 69 |
6107 | 70 CRUFT_API extern void octave_save_signal_mask (void); |
4153 | 71 |
6107 | 72 CRUFT_API extern void octave_restore_signal_mask (void); |
4153 | 73 |
74 #ifdef __cplusplus | |
75 class | |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
76 octave_execution_exception |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
77 { |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
78 }; |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
79 |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
80 class |
4153 | 81 octave_interrupt_exception |
82 { | |
83 }; | |
84 #endif | |
85 | |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
86 enum octave_exception |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
87 { |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
88 octave_no_exception = 0, |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
89 octave_exec_exception = 1, |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
90 octave_alloc_exception = 2 |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
91 }; |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
92 |
6107 | 93 CRUFT_API extern sig_atomic_t octave_interrupt_immediately; |
4153 | 94 |
5133 | 95 /* |
96 > 0: interrupt pending | |
97 0: no interrupt pending | |
98 < 0: handling interrupt | |
99 */ | |
6107 | 100 CRUFT_API extern sig_atomic_t octave_interrupt_state; |
4180 | 101 |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
102 CRUFT_API extern sig_atomic_t octave_exception_state; |
4153 | 103 |
8837
c37081b9d5c9
add missing volatile declaration in quit.h
Jaroslav Hajek <highegg@gmail.com>
parents:
7481
diff
changeset
|
104 CRUFT_API extern volatile sig_atomic_t octave_signal_caught; |
5142 | 105 |
6107 | 106 CRUFT_API extern void octave_handle_signal (void); |
5142 | 107 |
6107 | 108 CRUFT_API extern void octave_throw_interrupt_exception (void) GCC_ATTR_NORETURN; |
4153 | 109 |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
110 CRUFT_API extern void octave_throw_execution_exception (void) GCC_ATTR_NORETURN; |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
111 |
6107 | 112 CRUFT_API extern void octave_throw_bad_alloc (void) GCC_ATTR_NORETURN; |
4180 | 113 |
8928
80f044c83de3
quit.h (octave_rethrow_exception): Don't tag with GCC_ATTR_NORETURN
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
114 CRUFT_API extern void octave_rethrow_exception (void); |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
115 |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
116 #ifdef __cplusplus |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
117 inline void octave_quit (void) |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
118 { |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
119 if (octave_signal_caught) |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
120 { |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
121 octave_signal_caught = 0; |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
122 octave_handle_signal (); |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
123 } |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
124 }; |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
125 |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
126 #define OCTAVE_QUIT octave_quit () |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
127 |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
128 #else |
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
129 |
4153 | 130 #define OCTAVE_QUIT \ |
131 do \ | |
132 { \ | |
5142 | 133 if (octave_signal_caught) \ |
4153 | 134 { \ |
5142 | 135 octave_signal_caught = 0; \ |
136 octave_handle_signal (); \ | |
4153 | 137 } \ |
138 } \ | |
139 while (0) | |
10142
829e69ec3110
make OCTAVE_QUIT a function
Jaroslav Hajek <highegg@gmail.com>
parents:
9933
diff
changeset
|
140 #endif |
4153 | 141 |
4302 | 142 /* Normally, you just want to use |
143 | |
144 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | |
145 ... some code that calls a "foreign" function ... | |
146 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | |
147 | |
148 but sometimes it is useful to do something like | |
149 | |
150 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_1; | |
151 ... custom code here, normally ending in a call to | |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
152 octave_rethrow_exception ... |
4302 | 153 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_2; |
154 | |
155 so that you can perform extra clean up operations before throwing | |
156 the interrupt exception. */ | |
157 | |
4153 | 158 #define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE \ |
4302 | 159 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_1; \ |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
160 octave_rethrow_exception (); \ |
4302 | 161 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_2 |
162 | |
163 #define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_1 \ | |
4153 | 164 do \ |
165 { \ | |
4182 | 166 octave_jmp_buf saved_context; \ |
4153 | 167 \ |
5760 | 168 octave_save_current_context (saved_context); \ |
4153 | 169 \ |
170 if (octave_set_current_context) \ | |
9930
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
171 { \ |
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
172 octave_restore_current_context (saved_context) |
4302 | 173 |
174 #define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_2 \ | |
9930
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
175 } \ |
4153 | 176 else \ |
9930
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
177 { \ |
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
178 octave_interrupt_immediately++ |
4153 | 179 |
180 #define END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE \ | |
9930
1ddc25c3623a
libcruft/misc: untabify sources
John W. Eaton <jwe@octave.org>
parents:
8928
diff
changeset
|
181 octave_interrupt_immediately--; \ |
5760 | 182 octave_restore_current_context (saved_context); \ |
4153 | 183 } \ |
184 } \ | |
185 while (0) | |
186 | |
4196 | 187 #ifdef __cplusplus |
188 | |
4180 | 189 #define BEGIN_INTERRUPT_WITH_EXCEPTIONS \ |
4182 | 190 sig_atomic_t saved_octave_interrupt_immediately = octave_interrupt_immediately; \ |
4180 | 191 \ |
4182 | 192 try \ |
4180 | 193 { \ |
4182 | 194 octave_interrupt_immediately = 0; |
4180 | 195 |
196 #define END_INTERRUPT_WITH_EXCEPTIONS \ | |
197 } \ | |
20535
b70cc4bd8109
begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents:
19697
diff
changeset
|
198 catch (const octave_interrupt_exception&) \ |
4180 | 199 { \ |
4182 | 200 octave_interrupt_immediately = saved_octave_interrupt_immediately; \ |
4180 | 201 octave_jump_to_enclosing_context (); \ |
202 } \ | |
20535
b70cc4bd8109
begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents:
19697
diff
changeset
|
203 catch (const octave_execution_exception&) \ |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
204 { \ |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
205 octave_interrupt_immediately = saved_octave_interrupt_immediately; \ |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
206 octave_exception_state = octave_exec_exception; \ |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
207 octave_jump_to_enclosing_context (); \ |
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
208 } \ |
20535
b70cc4bd8109
begin removal of global error_state variable
John W. Eaton <jwe@octave.org>
parents:
19697
diff
changeset
|
209 catch (const std::bad_alloc&) \ |
4180 | 210 { \ |
4182 | 211 octave_interrupt_immediately = saved_octave_interrupt_immediately; \ |
7481
78f3811155f7
use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
212 octave_exception_state = octave_alloc_exception; \ |
4180 | 213 octave_jump_to_enclosing_context (); \ |
214 } \ | |
215 \ | |
4182 | 216 octave_interrupt_immediately = saved_octave_interrupt_immediately |
4196 | 217 #endif |
4153 | 218 |
219 #ifdef __cplusplus | |
220 } | |
4560 | 221 |
4572 | 222 /* These should only be declared for C++ code, and should also be |
223 outside of any extern "C" block. */ | |
4560 | 224 |
6107 | 225 extern CRUFT_API void (*octave_signal_hook) (void); |
226 extern CRUFT_API void (*octave_interrupt_hook) (void); | |
227 extern CRUFT_API void (*octave_bad_alloc_hook) (void); | |
4560 | 228 |
4153 | 229 #endif |
230 | |
231 #endif |