diff options
author | Andrew Cagney <cagney@redhat.com> | 2005-02-08 23:44:06 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2005-02-08 23:44:06 +0000 |
commit | 6941d02a18df94a250129611982bc7ab11d6124b (patch) | |
tree | 8a94a056da9127da497a383e73cca8b4403c7ff1 /gdb/exceptions.h | |
parent | c36e61546a6b7327e6bd305f78febad60067bab0 (diff) | |
download | gdb-6941d02a18df94a250129611982bc7ab11d6124b.zip gdb-6941d02a18df94a250129611982bc7ab11d6124b.tar.gz gdb-6941d02a18df94a250129611982bc7ab11d6124b.tar.bz2 |
2005-02-08 Andrew Cagney <cagney@gnu.org>
* exceptions.c: Do not include <setjmp.h>.
(SIGJMP_BUF, SIGSETJMP, SIGLONGJMP): Delete macros.
(catch_exception, catch_exceptions_with_msg, catch_errors)
(catch_command_errors): Use TRY_CATCH.
(struct catcher): Use EXCEPTIONS_SIGJMP_BUF.
(exceptions_state_mc_init): Rename catcher_init.
(exceptions_state_mc): Rename catcher_state_machine.
(exceptions_state_mc_action_iter)
(exceptions_state_mc_action_iter_1): New functions.
* exceptions.h: Include <setjmp.h>.
(EXCEPTIONS_SIGJMP_BUF, EXCEPTIONS_SIGSETJMP)
(EXCEPTIONS_SIGLONGJMP): Define.
(exceptions_state_mc_init, exceptions_state_mc_action_iter)
(exceptions_state_mc_action_iter_1): Declare.
(TRY_CATCH): Define.
Diffstat (limited to 'gdb/exceptions.h')
-rw-r--r-- | gdb/exceptions.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gdb/exceptions.h b/gdb/exceptions.h index fe19ecd..a47742a 100644 --- a/gdb/exceptions.h +++ b/gdb/exceptions.h @@ -24,6 +24,10 @@ #ifndef EXCEPTIONS_H #define EXCEPTIONS_H +struct ui_out; + +#include <setjmp.h> + /* Reasons for calling throw_exceptions(). NOTE: all reason values must be less than zero. enum value 0 is reserved for internal use as the return value from an initial setjmp(). The function @@ -66,6 +70,59 @@ struct exception /* A pre-defined non-exception. */ extern const struct exception exception_none; +/* Wrap set/long jmp so that it's more portable (internal to + exceptions). */ + +#if defined(HAVE_SIGSETJMP) +#define EXCEPTIONS_SIGJMP_BUF sigjmp_buf +#define EXCEPTIONS_SIGSETJMP(buf) sigsetjmp((buf), 1) +#define EXCEPTIONS_SIGLONGJMP(buf,val) siglongjmp((buf), (val)) +#else +#define EXCEPTIONS_SIGJMP_BUF jmp_buf +#define EXCEPTIONS_SIGSETJMP(buf) setjmp(buf) +#define EXCEPTIONS_SIGLONGJMP(buf,val) longjmp((buf), (val)) +#endif + +/* Functions to drive the exceptions state m/c (internal to + exceptions). */ +EXCEPTIONS_SIGJMP_BUF *exceptions_state_mc_init (struct ui_out *func_uiout, + volatile struct exception * + exception, + return_mask mask); +int exceptions_state_mc_action_iter (void); +int exceptions_state_mc_action_iter_1 (void); + +/* Macro to wrap up standard try/catch behavior. + + The double loop lets us correctly handle code "break"ing out of the + try catch block. (It works as the "break" only exits the inner + "while" loop, the outer for loop detects this handling it + correctly.) Of course "return" and "goto" are not so lucky. + + For instance: + + *INDENT-OFF* + + volatile struct exception e; + TRY_CATCH (e, RETURN_MASK_ERROR) + { + } + switch (e.reason) + { + case RETURN_ERROR: ... + } + + */ + +#define TRY_CATCH(EXCEPTION,MASK) \ + for (EXCEPTIONS_SIGSETJMP \ + (*exceptions_state_mc_init (uiout, &(EXCEPTION), (MASK))); \ + exceptions_state_mc_action_iter (); ) \ + while (exceptions_state_mc_action_iter_1 ()) + +/* *INDENT-ON* */ + + /* If E is an exception, print it's error message on the specified stream. for _fprintf, prefix the message with PREFIX... */ extern void exception_print (struct ui_file *file, struct exception e); |