From a88b13c7e36e8eb0a3bf772d508380682536c0da Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 8 Nov 2016 15:13:49 -0700 Subject: [PATCH] Use gdbpy_enter in gdbpy_before_prompt_hook Change gdbpy_before_prompt_hook to use gdbpy_enter and gdbpy_ref. This also rearranges the function a tiny bit to make it more clear. 2017-01-10 Tom Tromey * python/python.c (gdbpy_before_prompt_hook): Use gdbpy_enter, gdbpy_ref. --- gdb/ChangeLog | 5 ++++ gdb/python/python.c | 72 +++++++++++++++++++++------------------------ 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9f4b40194a3..efd786a71b3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-01-10 Tom Tromey + + * python/python.c (gdbpy_before_prompt_hook): Use gdbpy_enter, + gdbpy_ref. + 2017-01-10 Tom Tromey * python/py-prettyprint.c (gdbpy_apply_val_pretty_printer): Use diff --git a/gdb/python/python.c b/gdb/python/python.c index 96afa5bbcee..235477c9f61 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1005,76 +1005,70 @@ static enum ext_lang_rc gdbpy_before_prompt_hook (const struct extension_language_defn *extlang, const char *current_gdb_prompt) { - struct cleanup *cleanup; - gdb::unique_xmalloc_ptr prompt; - if (!gdb_python_initialized) return EXT_LANG_RC_NOP; - cleanup = ensure_python_env (get_current_arch (), current_language); + gdbpy_enter enter_py (get_current_arch (), current_language); if (gdb_python_module && PyObject_HasAttrString (gdb_python_module, "prompt_hook")) { - PyObject *hook; - - hook = PyObject_GetAttrString (gdb_python_module, "prompt_hook"); + gdbpy_ref hook (PyObject_GetAttrString (gdb_python_module, + "prompt_hook")); if (hook == NULL) - goto fail; - - make_cleanup_py_decref (hook); - - if (PyCallable_Check (hook)) { - PyObject *result; - PyObject *current_prompt; + gdbpy_print_stack (); + return EXT_LANG_RC_ERROR; + } - current_prompt = PyString_FromString (current_gdb_prompt); + if (PyCallable_Check (hook.get ())) + { + gdbpy_ref current_prompt (PyString_FromString (current_gdb_prompt)); if (current_prompt == NULL) - goto fail; - - result = PyObject_CallFunctionObjArgs (hook, current_prompt, NULL); - - Py_DECREF (current_prompt); + { + gdbpy_print_stack (); + return EXT_LANG_RC_ERROR; + } + gdbpy_ref result (PyObject_CallFunctionObjArgs (hook.get (), + current_prompt.get (), + NULL)); if (result == NULL) - goto fail; - - make_cleanup_py_decref (result); + { + gdbpy_print_stack (); + return EXT_LANG_RC_ERROR; + } /* Return type should be None, or a String. If it is None, fall through, we will not set a prompt. If it is a string, set PROMPT. Anything else, set an exception. */ - if (result != Py_None && ! PyString_Check (result)) + if (result != Py_None && ! PyString_Check (result.get ())) { PyErr_Format (PyExc_RuntimeError, _("Return from prompt_hook must " \ "be either a Python string, or None")); - goto fail; + gdbpy_print_stack (); + return EXT_LANG_RC_ERROR; } if (result != Py_None) { - prompt = python_string_to_host_string (result); + gdb::unique_xmalloc_ptr + prompt (python_string_to_host_string (result.get ())); if (prompt == NULL) - goto fail; + { + gdbpy_print_stack (); + return EXT_LANG_RC_ERROR; + } + + set_prompt (prompt.get ()); + return EXT_LANG_RC_OK; } } } - /* If a prompt has been set, PROMPT will not be NULL. If it is - NULL, do not set the prompt. */ - if (prompt != NULL) - set_prompt (prompt.get ()); - - do_cleanups (cleanup); - return prompt != NULL ? EXT_LANG_RC_OK : EXT_LANG_RC_NOP; - - fail: - gdbpy_print_stack (); - do_cleanups (cleanup); - return EXT_LANG_RC_ERROR; + return EXT_LANG_RC_NOP; } -- 2.30.2