From 7c03e522d4e059a7c59533e4b01771a7cc4bb68e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 11 Jun 2024 14:10:08 -0600 Subject: Return gdbpy_ref<> from gdbpy_call_method This changes gdbpy_call_method to return a gdbpy_ref<>. This is slightly safer because it makes it simpler to correctly handle reference counts. Reviewed-By: Tom de Vries --- gdb/python/py-breakpoint.c | 2 +- gdb/python/py-disasm.c | 4 ++-- gdb/python/py-finishbreakpoint.c | 2 +- gdb/python/py-framefilter.c | 16 ++++++++-------- gdb/python/py-tui.c | 16 ++++++++-------- gdb/python/python-internal.h | 18 +++++++++--------- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 1b8c717..fdc2483 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -1174,7 +1174,7 @@ gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang, if (PyObject_HasAttrString (py_bp, stop_func)) { - gdbpy_ref<> result (gdbpy_call_method (py_bp, stop_func)); + gdbpy_ref<> result = gdbpy_call_method (py_bp, stop_func); stop = 1; if (result != NULL) diff --git a/gdb/python/py-disasm.c b/gdb/python/py-disasm.c index 5206c76..87fea26 100644 --- a/gdb/python/py-disasm.c +++ b/gdb/python/py-disasm.c @@ -855,8 +855,8 @@ gdbpy_disassembler::read_memory_func (bfd_vma memaddr, gdb_byte *buff, /* Now call the DisassembleInfo.read_memory method. This might have been overridden by the user. */ - gdbpy_ref<> result_obj (gdbpy_call_method ((PyObject *) obj, "read_memory", - len, offset)); + gdbpy_ref<> result_obj = gdbpy_call_method ((PyObject *) obj, "read_memory", + len, offset); /* Handle any exceptions. */ if (result_obj == nullptr) diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c index 1b620e6..78030be 100644 --- a/gdb/python/py-finishbreakpoint.c +++ b/gdb/python/py-finishbreakpoint.c @@ -344,7 +344,7 @@ bpfinishpy_out_of_scope (struct finish_breakpoint_object *bpfinish_obj) if (bpfinish_obj->py_bp.bp->enable_state == bp_enabled && PyObject_HasAttrString (py_obj, outofscope_func)) { - gdbpy_ref<> meth_result (gdbpy_call_method (py_obj, outofscope_func)); + gdbpy_ref<> meth_result = gdbpy_call_method (py_obj, outofscope_func); if (meth_result == NULL) gdbpy_print_stack (); } diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 4ae583b..89695ff 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -59,7 +59,7 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr *name, struct symbol **sym, const struct block **sym_block, const struct language_defn **language) { - gdbpy_ref<> result (gdbpy_call_method (obj, "symbol")); + gdbpy_ref<> result = gdbpy_call_method (obj, "symbol"); if (result == NULL) return EXT_LANG_BT_ERROR; @@ -130,7 +130,7 @@ extract_value (PyObject *obj, struct value **value) { if (PyObject_HasAttrString (obj, "value")) { - gdbpy_ref<> vresult (gdbpy_call_method (obj, "value")); + gdbpy_ref<> vresult = gdbpy_call_method (obj, "value"); if (vresult == NULL) return EXT_LANG_BT_ERROR; @@ -264,7 +264,7 @@ get_py_iter_from_func (PyObject *filter, const char *func) { if (PyObject_HasAttrString (filter, func)) { - gdbpy_ref<> result (gdbpy_call_method (filter, func)); + gdbpy_ref<> result = gdbpy_call_method (filter, func); if (result != NULL) { @@ -790,7 +790,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, /* Get the underlying frame. This is needed to determine GDB architecture, and also, in the cases of frame variables/arguments to read them if they returned filter object requires us to do so. */ - gdbpy_ref<> py_inf_frame (gdbpy_call_method (filter, "inferior_frame")); + gdbpy_ref<> py_inf_frame = gdbpy_call_method (filter, "inferior_frame"); if (py_inf_frame == NULL) return EXT_LANG_BT_ERROR; @@ -830,7 +830,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, address printing. */ if (PyObject_HasAttrString (filter, "address")) { - gdbpy_ref<> paddr (gdbpy_call_method (filter, "address")); + gdbpy_ref<> paddr = gdbpy_call_method (filter, "address"); if (paddr == NULL) return EXT_LANG_BT_ERROR; @@ -905,7 +905,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, /* Print frame function name. */ if (PyObject_HasAttrString (filter, "function")) { - gdbpy_ref<> py_func (gdbpy_call_method (filter, "function")); + gdbpy_ref<> py_func = gdbpy_call_method (filter, "function"); const char *function = NULL; if (py_func == NULL) @@ -969,7 +969,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, if (PyObject_HasAttrString (filter, "filename")) { - gdbpy_ref<> py_fn (gdbpy_call_method (filter, "filename")); + gdbpy_ref<> py_fn = gdbpy_call_method (filter, "filename"); if (py_fn == NULL) return EXT_LANG_BT_ERROR; @@ -993,7 +993,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, if (PyObject_HasAttrString (filter, "line")) { - gdbpy_ref<> py_line (gdbpy_call_method (filter, "line")); + gdbpy_ref<> py_line = gdbpy_call_method (filter, "line"); int line; if (py_line == NULL) diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index 9df86df..901f6fe 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -164,7 +164,7 @@ tui_py_window::~tui_py_window () if (m_window != nullptr && PyObject_HasAttrString (m_window.get (), "close")) { - gdbpy_ref<> result (gdbpy_call_method (m_window.get (), "close")); + gdbpy_ref<> result = gdbpy_call_method (m_window.get (), "close"); if (result == nullptr) gdbpy_print_stack (); } @@ -197,7 +197,7 @@ tui_py_window::rerender () if (PyObject_HasAttrString (m_window.get (), "render")) { - gdbpy_ref<> result (gdbpy_call_method (m_window.get (), "render")); + gdbpy_ref<> result = gdbpy_call_method (m_window.get (), "render"); if (result == nullptr) gdbpy_print_stack (); } @@ -210,8 +210,8 @@ tui_py_window::do_scroll_horizontal (int num_to_scroll) if (PyObject_HasAttrString (m_window.get (), "hscroll")) { - gdbpy_ref<> result (gdbpy_call_method (m_window.get (), "hscroll", - num_to_scroll)); + gdbpy_ref<> result = gdbpy_call_method (m_window.get(), "hscroll", + num_to_scroll); if (result == nullptr) gdbpy_print_stack (); } @@ -224,8 +224,8 @@ tui_py_window::do_scroll_vertical (int num_to_scroll) if (PyObject_HasAttrString (m_window.get (), "vscroll")) { - gdbpy_ref<> result (gdbpy_call_method (m_window.get (), "vscroll", - num_to_scroll)); + gdbpy_ref<> result = gdbpy_call_method (m_window.get (), "vscroll", + num_to_scroll); if (result == nullptr) gdbpy_print_stack (); } @@ -246,8 +246,8 @@ tui_py_window::click (int mouse_x, int mouse_y, int mouse_button) if (PyObject_HasAttrString (m_window.get (), "click")) { - gdbpy_ref<> result (gdbpy_call_method (m_window.get (), "click", - mouse_x, mouse_y, mouse_button)); + gdbpy_ref<> result = gdbpy_call_method (m_window.get (), "click", + mouse_x, mouse_y, mouse_button); if (result == nullptr) gdbpy_print_stack (); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 1ebb531..caf85f5 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -176,14 +176,14 @@ gdbpy_make_fmt () This variant accepts no arguments. */ -static inline PyObject * +static inline gdbpy_ref<> gdbpy_call_method (PyObject *o, const char *method) { /* PyObject_CallMethod's 'method' and 'format' parameters were missing the 'const' qualifier before Python 3.4. */ - return PyObject_CallMethod (o, - const_cast (method), - nullptr); + return gdbpy_ref<> (PyObject_CallMethod (o, + const_cast (method), + nullptr)); } /* Typesafe wrapper around PyObject_CallMethod. @@ -193,7 +193,7 @@ gdbpy_call_method (PyObject *o, const char *method) mismatches are impossible. */ template -static inline PyObject * +static inline gdbpy_ref<> gdbpy_call_method (PyObject *o, const char *method, Arg arg, Args... args) { @@ -201,10 +201,10 @@ gdbpy_call_method (PyObject *o, const char *method, /* PyObject_CallMethod's 'method' and 'format' parameters were missing the 'const' qualifier before Python 3.4. */ - return PyObject_CallMethod (o, - const_cast (method), - const_cast (fmt.data ()), - arg, args...); + return gdbpy_ref<> (PyObject_CallMethod (o, + const_cast (method), + const_cast (fmt.data ()), + arg, args...)); } /* Poison PyObject_CallMethod. The typesafe wrapper gdbpy_call_method should be -- cgit v1.1