diff options
author | Tom Tromey <tom@tromey.com> | 2016-11-08 11:11:55 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-01-10 19:13:46 -0700 |
commit | 6349f452e01ddb7a1e64b8a63c93a9c9abc95725 (patch) | |
tree | 90083421b411483f6dbf9c18ebe0906b3a00fbe4 /gdb/python | |
parent | c0171de646ddd85bac9d4bb1ebdf601f7ba7eeab (diff) | |
download | gdb-6349f452e01ddb7a1e64b8a63c93a9c9abc95725.zip gdb-6349f452e01ddb7a1e64b8a63c93a9c9abc95725.tar.gz gdb-6349f452e01ddb7a1e64b8a63c93a9c9abc95725.tar.bz2 |
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 <tom@tromey.com>
* 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.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-framefilter.c | 55 |
1 files changed, 21 insertions, 34 deletions
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 6d22321..115e38a 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; } |