[PATCH 34/36] more making TRY/CATCH callers look more like real C++ try/catch blocks

Pedro Alves
2015-02-09T23:50:32Z

All these were caught by actually making TRY/CATCH use try/catch
behind the scenes, which then resulted in the build failing because
there was code between the try and catch blocks.

As with the prior patch, this could either be done _before_ running
the TRY_CATCH conversion script, or be squashed into it.
---
gdb/breakpoint.c | 5 +++--
gdb/gdbtypes.c | 24 ++++++++++++++----------
gdb/guile/scm-frame.c | 9 +++------
gdb/linux-thread-db.c | 10 ++++++----
gdb/python/py-breakpoint.c | 3 ++-
gdb/record-btrace.c | 20 ++++++++++----------
6 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index b5a9704..4db4084 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -15899,6 +15899,7 @@ save_breakpoints (char *filename, int from_tty,

if (tp->type != bp_dprintf && tp->commands)
{
+ struct gdb_exception exception;

fprintf_unfiltered (fp, " commands\n");

@@ -15907,14 +15908,14 @@ save_breakpoints (char *filename, int from_tty,
{
print_command_lines (current_uiout, tp->commands->commands, 2);
}
- ui_out_redirect (current_uiout, NULL);
-
CATCH (ex, RETURN_MASK_ALL)
{
+ ui_out_redirect (current_uiout, NULL);
throw_exception (ex);
}
END_CATCH

+ ui_out_redirect (current_uiout, NULL);
fprintf_unfiltered (fp, " end\n");
}

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 54130b6..ff3bdf4 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -2301,7 +2301,6 @@ safe_parse_type (struct gdbarch *gdbarch, char *p, int length)
{
type = parse_and_eval_type (p, length);
}
-
CATCH (except, RETURN_MASK_ERROR)
{
type = builtin_type (gdbarch)->builtin_void;
@@ -3229,6 +3228,7 @@ check_types_worklist (VEC (type_equality_entry_d) **worklist,
int
types_deeply_equal (struct type *type1, struct type *type2)
{
+ struct gdb_exception except = exception_none;
int result = 0;
struct bcache *cache;
VEC (type_equality_entry_d) *worklist = NULL;
@@ -3246,23 +3246,27 @@ types_deeply_equal (struct type *type1, struct type *type2)
entry.type2 = type2;
VEC_safe_push (type_equality_entry_d, worklist, &entry);

+ /* check_types_worklist calls several nested helper functions, some
+ of which can raise a GDB exception, so we just check and rethrow
+ here. If there is a GDB exception, a comparison is not capable
+ (or trusted), so exit. */
TRY
{
result = check_types_worklist (&worklist, cache);
}
- /* check_types_worklist calls several nested helper functions,
- some of which can raise a GDB Exception, so we just check
- and rethrow here. If there is a GDB exception, a comparison
- is not capable (or trusted), so exit. */
- bcache_xfree (cache);
- VEC_free (type_equality_entry_d, worklist);
- /* Rethrow if there was a problem. */
- CATCH (except, RETURN_MASK_ALL)
+ CATCH (ex, RETURN_MASK_ALL)
{
- throw_exception (except);
+ except = ex;
}
END_CATCH

+ bcache_xfree (cache);
+ VEC_free (type_equality_entry_d, worklist);
+
+ /* Rethrow if there was a problem. */
+ if (except.reason < 0)
+ throw_exception (except);
+
return result;
}
\f
diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c
index 6189802..ea51d1b 100644
--- a/gdb/guile/scm-frame.c
+++ b/gdb/guile/scm-frame.c
@@ -426,7 +426,6 @@ gdbscm_frame_name (SCM self)
enum language lang = language_minimal;
struct frame_info *frame = NULL;
SCM result;
- struct gdb_exception except = exception_none;

f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);

@@ -436,15 +435,13 @@ gdbscm_frame_name (SCM self)
if (frame != NULL)
find_frame_funname (frame, &name, &lang, NULL);
}
- CATCH (ex, RETURN_MASK_ALL)
+ CATCH (except, RETURN_MASK_ALL)
{
- except = ex;
+ xfree (name);
+ GDBSCM_HANDLE_GDB_EXCEPTION (except);
}
END_CATCH

- xfree (name);
- GDBSCM_HANDLE_GDB_EXCEPTION (except);
-
if (frame == NULL)
{
gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self,
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 87596d2..74f7e69 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -1730,16 +1730,18 @@ find_new_threads_once (struct thread_db_info *info, int iteration,
TD_SIGNO_MASK,
TD_THR_ANY_USER_FLAGS);
}
-
- if (libthread_db_debug)
+ CATCH (except, RETURN_MASK_ERROR)
{
- CATCH (except, RETURN_MASK_ERROR)
+ if (libthread_db_debug)
{
exception_fprintf (gdb_stdlog, except,
"Warning: find_new_threads_once: ");
}
- END_CATCH
+ }
+ END_CATCH

+ if (libthread_db_debug)
+ {
fprintf_unfiltered (gdb_stdlog,
_("Found %d new threads in iteration %d.\n"),
data.new_threads, iteration);
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index dcf1d5a..42a8596 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -503,15 +503,16 @@ bppy_get_commands (PyObject *self, void *closure)
{
print_command_lines (current_uiout, breakpoint_commands (bp), 0);
}
- ui_out_redirect (current_uiout, NULL);
CATCH (except, RETURN_MASK_ALL)
{
+ ui_out_redirect (current_uiout, NULL);
do_cleanups (chain);
gdbpy_convert_exception (except);
return NULL;
}
END_CATCH

+ ui_out_redirect (current_uiout, NULL);
cmdstr = ui_file_xstrdup (string_file, &length);
make_cleanup (xfree, cmdstr);
result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL);
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 1cbbd3e..8aedb0b 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -1116,14 +1116,13 @@ record_btrace_insert_breakpoint (struct target_ops *ops,
{
ret = ops->beneath->to_insert_breakpoint (ops->beneath, gdbarch, bp_tgt);
}
-
- replay_memory_access = old;
-
CATCH (except, RETURN_MASK_ALL)
{
+ replay_memory_access = old;
throw_exception (except);
}
END_CATCH
+ replay_memory_access = old;

return ret;
}
@@ -1148,14 +1147,13 @@ record_btrace_remove_breakpoint (struct target_ops *ops,
{
ret = ops->beneath->to_remove_breakpoint (ops->beneath, gdbarch, bp_tgt);
}
-
- replay_memory_access = old;
-
CATCH (except, RETURN_MASK_ALL)
{
+ replay_memory_access = old;
throw_exception (except);
}
END_CATCH
+ replay_memory_access = old;

return ret;
}
@@ -1667,12 +1665,11 @@ record_btrace_start_replaying (struct thread_info *tp)
if (upd_step_stack_frame_id)
tp->control.step_stack_frame_id = frame_id;
}
-
- /* Restore the previous execution state. */
- set_executing (tp->ptid, executing);
-
CATCH (except, RETURN_MASK_ALL)
{
+ /* Restore the previous execution state. */
+ set_executing (tp->ptid, executing);
+
xfree (btinfo->replay);
btinfo->replay = NULL;

@@ -1682,6 +1679,9 @@ record_btrace_start_replaying (struct thread_info *tp)
}
END_CATCH

+ /* Restore the previous execution state. */
+ set_executing (tp->ptid, executing);
+
return replay;
}

--
1.9.3