From 5fe41fbfa22275d2a277b408bf52fedec34e8336 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 27 Jun 2011 19:21:51 +0000 Subject: [PATCH] * valops.c (find_overload_match): Call do_cleanups before early return. * top.c (execute_command): Call do_cleanups before early return. (command_loop): Likewise. * stack.c (backtrace_command): Make a null cleanup early. Don't conditionally call do_cleanups. * python/py-value.c (TRY_CATCH): Move cleanup handling into TRY_CATCH. * python/py-breakpoint.c (gdbpy_breakpoint_has_py_cond): Rearrange so cleanups are always run. * mi/mi-cmd-var.c (mi_cmd_var_delete): Reset old_cleanups. * findcmd.c (parse_find_args): Call do_cleanups on early return path. * dbxread.c (elfstab_build_psymtabs): Make a null cleanup early. Don't conditionally call do_cleanups. * cli/cli-script.c (execute_user_command): Initialize 'old_chain' later. --- gdb/ChangeLog | 20 ++++++++++++++++++++ gdb/cli/cli-script.c | 4 ++-- gdb/dbxread.c | 7 +++---- gdb/findcmd.c | 1 + gdb/mi/mi-cmd-var.c | 2 +- gdb/python/py-breakpoint.c | 5 ++--- gdb/python/py-value.c | 12 +++++------- gdb/stack.c | 7 +++---- gdb/top.c | 10 ++++++++-- gdb/valops.c | 1 + 10 files changed, 46 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 31b987bfb0..8abff1fe09 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2011-06-27 Tom Tromey + + * valops.c (find_overload_match): Call do_cleanups before early + return. + * top.c (execute_command): Call do_cleanups before early return. + (command_loop): Likewise. + * stack.c (backtrace_command): Make a null cleanup early. Don't + conditionally call do_cleanups. + * python/py-value.c (TRY_CATCH): Move cleanup handling into + TRY_CATCH. + * python/py-breakpoint.c (gdbpy_breakpoint_has_py_cond): Rearrange + so cleanups are always run. + * mi/mi-cmd-var.c (mi_cmd_var_delete): Reset old_cleanups. + * findcmd.c (parse_find_args): Call do_cleanups on early return + path. + * dbxread.c (elfstab_build_psymtabs): Make a null cleanup early. + Don't conditionally call do_cleanups. + * cli/cli-script.c (execute_user_command): Initialize 'old_chain' + later. + 2011-06-27 Eric Botcazou * MAINTAINERS (Write After Approval): Use default email address. diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 2d1afe5180..c94f7eedaa 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -317,13 +317,13 @@ execute_user_command (struct cmd_list_element *c, char *args) static int user_call_depth = 0; extern int max_user_call_depth; - old_chain = setup_user_args (args); - cmdlines = c->user_commands; if (cmdlines == 0) /* Null command */ return; + old_chain = setup_user_args (args); + if (++user_call_depth > max_user_call_depth) error (_("Max user call depth exceeded -- command aborted.")); diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 0c5dc027fd..33c776f776 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -3433,7 +3433,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, bfd *sym_bfd = objfile->obfd; char *name = bfd_get_filename (sym_bfd); struct dbx_symfile_info *info; - struct cleanup *back_to = NULL; + struct cleanup *back_to = make_cleanup (null_cleanup, NULL); /* There is already a dbx_symfile_info allocated by our caller. It might even contain some info from the ELF symtab to help us. */ @@ -3477,7 +3477,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, symbuf_left = bfd_section_size (objfile->obfd, stabsect); stabs_data = symfile_relocate_debug_section (objfile, stabsect, NULL); if (stabs_data) - back_to = make_cleanup (free_current_contents, (void *) &stabs_data); + make_cleanup (free_current_contents, (void *) &stabs_data); /* In an elf file, we've already installed the minimal symbols that came from the elf (non-stab) symbol table, so always act like an @@ -3487,8 +3487,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, case it does, it will install them itself. */ dbx_symfile_read (objfile, 0); - if (back_to) - do_cleanups (back_to); + do_cleanups (back_to); } /* Scan and build partial symbols for a file with special sections for stabs diff --git a/gdb/findcmd.c b/gdb/findcmd.c index c21c02895a..0255613e49 100644 --- a/gdb/findcmd.c +++ b/gdb/findcmd.c @@ -132,6 +132,7 @@ parse_find_args (char *args, ULONGEST *max_countp, len = value_as_long (v); if (len == 0) { + do_cleanups (old_cleanups); printf_filtered (_("Empty search range.\n")); return; } diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index a40184680d..aee6224a99 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -196,7 +196,7 @@ mi_cmd_var_delete (char *command, char **argv, int argc) children_only_p = 1; do_cleanups (old_cleanups); name = xstrdup (argv[1]); - make_cleanup (free_current_contents, &name); + old_cleanups = make_cleanup (free_current_contents, &name); } /* If we didn't error out, now NAME contains the name of the diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index e73dc24e29..294e648ca9 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -771,10 +771,9 @@ gdbpy_breakpoint_has_py_cond (struct breakpoint_object *bp_obj) get_current_arch (); struct cleanup *cleanup = ensure_python_env (garch, current_language); - if (py_bp == NULL) - return 0; + if (py_bp != NULL) + has_func = PyObject_HasAttrString (py_bp, stop_func); - has_func = PyObject_HasAttrString (py_bp, stop_func); do_cleanups (cleanup); return has_func; diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 4381d52039..fc5053a77b 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -553,8 +553,6 @@ static PyObject * valpy_str (PyObject *self) { char *s = NULL; - struct ui_file *stb; - struct cleanup *old_chain; PyObject *result; struct value_print_options opts; volatile struct gdb_exception except; @@ -562,19 +560,19 @@ valpy_str (PyObject *self) get_user_print_options (&opts); opts.deref_ref = 0; - stb = mem_fileopen (); - old_chain = make_cleanup_ui_file_delete (stb); - TRY_CATCH (except, RETURN_MASK_ALL) { + struct ui_file *stb = mem_fileopen (); + struct cleanup *old_chain = make_cleanup_ui_file_delete (stb); + common_val_print (((value_object *) self)->value, stb, 0, &opts, python_language); s = ui_file_xstrdup (stb, NULL); + + do_cleanups (old_chain); } GDB_PY_HANDLE_EXCEPTION (except); - do_cleanups (old_chain); - result = PyUnicode_Decode (s, strlen (s), host_charset (), NULL); xfree (s); diff --git a/gdb/stack.c b/gdb/stack.c index 0888b69d3f..1e44367b19 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1425,7 +1425,7 @@ backtrace_command_stub (void *data) static void backtrace_command (char *arg, int from_tty) { - struct cleanup *old_chain = NULL; + struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); int fulltrace_arg = -1, arglen = 0, argc = 0; struct backtrace_command_args btargs; @@ -1435,7 +1435,7 @@ backtrace_command (char *arg, int from_tty) int i; argv = gdb_buildargv (arg); - old_chain = make_cleanup_freeargv (argv); + make_cleanup_freeargv (argv); argc = 0; for (i = 0; argv[i]; i++) { @@ -1481,8 +1481,7 @@ backtrace_command (char *arg, int from_tty) if (fulltrace_arg >= 0 && arglen > 0) xfree (arg); - if (old_chain) - do_cleanups (old_chain); + do_cleanups (old_chain); } static void diff --git a/gdb/top.c b/gdb/top.c index 58c50755c7..ecb91f2b0e 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -378,7 +378,10 @@ execute_command (char *p, int from_tty) /* This can happen when command_line_input hits end of file. */ if (p == NULL) - return; + { + do_cleanups (cleanup); + return; + } target_log_command (p); @@ -542,7 +545,10 @@ command_loop (void) get_prompt () : (char *) NULL, instream == stdin, "prompt"); if (command == 0) - return; + { + do_cleanups (old_chain); + return; + } make_command_stats_cleanup (1); diff --git a/gdb/valops.c b/gdb/valops.c index f5458ef946..803b73cdca 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2670,6 +2670,7 @@ find_overload_match (struct type **arg_types, int nargs, if (func_name == NULL) { *symp = fsym; + do_cleanups (all_cleanups); return 0; } -- 2.34.1