From: Tom Tromey Date: Tue, 8 Nov 2016 18:11:55 +0000 (-0700) Subject: Introduce htab_up and use gdbpy_enter in py-framefilter.c X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6349f452e01ddb7a1e64b8a63c93a9c9abc95725;p=binutils-gdb.git Introduce htab_up and use gdbpy_enter in py-framefilter.c This introduces a new "htab_up" typedef, which is a std::unique_ptr that can call htab_delete. Then it changes some code in py-framefilter.c to use both gdbpy_enter and the new htab_up. 2017-01-10 Tom Tromey * utils.h (htab_deleter): New struct. (htab_up): New typedef. * python/py-framefilter.c (gdbpy_apply_frame_filter): Use gdbpy_enter, gdbpy_ref, htab_up. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e1e8553d7c..fbe10397c04 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-01-10 Tom Tromey + + * utils.h (htab_deleter): New struct. + (htab_up): New typedef. + * python/py-framefilter.c (gdbpy_apply_frame_filter): Use + gdbpy_enter, gdbpy_ref, htab_up. + 2017-01-10 Tom Tromey * python/py-unwind.c (pending_frame_invalidate): Remove. diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 6d22321ef1c..115e38afdb9 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -1491,11 +1491,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, struct ui_out *out, int frame_low, int frame_high) { struct gdbarch *gdbarch = NULL; - struct cleanup *cleanups; enum ext_lang_bt_status success = EXT_LANG_BT_ERROR; - PyObject *iterable; - PyObject *item; - htab_t levels_printed; if (!gdb_python_initialized) return EXT_LANG_BT_NO_FILTERS; @@ -1511,9 +1507,10 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, } END_CATCH - cleanups = ensure_python_env (gdbarch, current_language); + gdbpy_enter enter_py (gdbarch, current_language); - iterable = bootstrap_python_frame_filters (frame, frame_low, frame_high); + gdbpy_ref iterable (bootstrap_python_frame_filters (frame, frame_low, + frame_high)); if (iterable == NULL) { @@ -1531,34 +1528,36 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, default backtrace. */ gdbpy_print_stack (); - do_cleanups (cleanups); return EXT_LANG_BT_NO_FILTERS; } /* If iterable is None, then there are no frame filters registered. If this is the case, defer to default GDB printing routines in MI and CLI. */ - make_cleanup_py_decref (iterable); if (iterable == Py_None) - { - success = EXT_LANG_BT_NO_FILTERS; - goto done; - } + return EXT_LANG_BT_NO_FILTERS; - levels_printed = htab_create (20, - htab_hash_pointer, - htab_eq_pointer, - NULL); - make_cleanup_htab_delete (levels_printed); + htab_up levels_printed (htab_create (20, + htab_hash_pointer, + htab_eq_pointer, + NULL)); - while ((item = PyIter_Next (iterable))) + while (true) { - struct cleanup *item_cleanup = make_cleanup_py_decref (item); + gdbpy_ref item (PyIter_Next (iterable.get ())); - success = py_print_frame (item, flags, args_type, out, 0, - levels_printed); + if (item == NULL) + { + if (PyErr_Occurred ()) + { + gdbpy_print_stack (); + return EXT_LANG_BT_ERROR; + } + break; + } - do_cleanups (item_cleanup); + success = py_print_frame (item.get (), flags, args_type, out, 0, + levels_printed.get ()); /* Do not exit on error printing a single frame. Print the error and continue with other frames. */ @@ -1566,17 +1565,5 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, gdbpy_print_stack (); } - if (item == NULL && PyErr_Occurred ()) - goto error; - - done: - do_cleanups (cleanups); return success; - - /* Exit and abandon backtrace on error, printing the exception that - is set. */ - error: - gdbpy_print_stack (); - do_cleanups (cleanups); - return EXT_LANG_BT_ERROR; } diff --git a/gdb/utils.h b/gdb/utils.h index 351814ea81c..d7ae9cc81bf 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -100,6 +100,18 @@ extern struct cleanup *make_cleanup_free_so (struct so_list *so); extern struct cleanup *make_cleanup_restore_current_language (void); +/* A deleter for a hash table. */ +struct htab_deleter +{ + void operator() (htab *ptr) const + { + htab_delete (ptr); + } +}; + +/* A unique_ptr wrapper for htab_t. */ +typedef std::unique_ptr htab_up; + extern struct cleanup *make_cleanup_htab_delete (htab_t htab); struct parser_state;