From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14578 invoked by alias); 26 Apr 2012 13:24:32 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 14539 invoked by uid 9514); 26 Apr 2012 13:24:27 -0000 Date: Thu, 26 Apr 2012 13:24:00 -0000 Message-ID: <20120426132427.14523.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-pmuldoon-python-backtrace: Fix some memory leaks and reorganize tuple interrogation X-Git-Refname: refs/heads/archer-pmuldoon-python-backtrace X-Git-Reftype: branch X-Git-Oldrev: 6560e7ffa74235e628c2817727b7393c6bd14e99 X-Git-Newrev: e4ca4731c3094c5e61bd20effc10012341be942b X-SW-Source: 2012-q2/txt/msg00026.txt.bz2 List-Id: The branch, archer-pmuldoon-python-backtrace has been updated via e4ca4731c3094c5e61bd20effc10012341be942b (commit) from 6560e7ffa74235e628c2817727b7393c6bd14e99 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit e4ca4731c3094c5e61bd20effc10012341be942b Author: Phil Muldoon Date: Thu Apr 26 14:23:53 2012 +0100 Fix some memory leaks and reorganize tuple interrogation ----------------------------------------------------------------------- Summary of changes: gdb/python/py-framefilter.c | 380 ++++++++++++++++++++++--------------------- 1 files changed, 191 insertions(+), 189 deletions(-) First 500 lines of diff: diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index c1d44e4..fec12f3 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -44,14 +44,17 @@ search_frame_filter_list (PyObject *list, PyObject *frame, { Py_ssize_t list_size, list_index; - PyObject *function; PyObject *filter = NULL; - PyObject *slimit; - PyObject *arg; + PyObject *slimit = PyLong_FromLong (limit); + + if (! slimit) + return NULL; list_size = PyList_Size (list); for (list_index = 0; list_index < list_size; list_index++) { + PyObject *function; + function = PyList_GetItem (list, list_index); if (! function) return NULL; @@ -74,13 +77,19 @@ search_frame_filter_list (PyObject *list, PyObject *frame, continue; } - slimit = PyLong_FromLong (limit); filter = PyObject_CallFunctionObjArgs (function, frame, slimit, NULL); + Py_DECREF (slimit); if (! filter) - return NULL; + { + Py_DECREF (slimit); + return NULL; + } else if (filter != Py_None) - return filter; + { + Py_DECREF (slimit); + return filter; + } Py_DECREF (filter); } @@ -218,7 +227,6 @@ py_print_locals (PyObject *filter, struct value_print_options opts) { int indent = 4; - struct ui_stream *stb; struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); if (PyObject_HasAttrString (filter, "frame_locals")) @@ -242,96 +250,91 @@ py_print_locals (PyObject *filter, size = PyList_Size (result); - if (size > 0) + for (list_index = 0; list_index < size; list_index++) { - for (list_index = 0; list_index < size; list_index++) + PyObject *sym_tuple, *sym, *value; + char *sym_name; + struct value *val; + struct symbol *symbol; + + sym_tuple = PyList_GetItem (result, list_index); + if (! sym_tuple) + goto locals_error; + + if (! PyTuple_Check (sym_tuple) + && PyTuple_Size (sym_tuple) != 2) { - PyObject *sym_tuple, *sym, *value; - char *sym_name; - struct value *val; - struct symbol *symbol; + PyErr_SetString (PyExc_RuntimeError, + _("frame_locals list must contain a Python tuple.")); + goto locals_error; + } - sym_tuple = PyList_GetItem (result, list_index); - if (! sym_tuple) - goto locals_error; + /* Each element in the locals arguments list should be a + tuple containing two elements. The local name, + which can be a string or a gdb.Symbol, and the + value. */ - if (! PyTuple_Check (sym_tuple) - && PyTuple_Size (sym_tuple) != 2) - { - PyErr_SetString (PyExc_RuntimeError, - _("frame_locals list must contain a Python tuple.")); - goto locals_error; - } - - /* Each element in the locals arguments list should be a - tuple containing two elements. The local name, - which can be a string or a gdb.Symbol, and the - value. */ - - /* Name. */ - sym = PyTuple_GetItem (sym_tuple, 0); - if (! sym) - goto locals_error; - - /* Value. */ - value = PyTuple_GetItem (sym_tuple, 1); - if (! value) + /* Name. */ + sym = PyTuple_GetItem (sym_tuple, 0); + if (! sym) + goto locals_error; + + /* Value. */ + value = PyTuple_GetItem (sym_tuple, 1); + if (! value) + goto locals_error; + + /* For arg name, the user can return a symbol or a + string. */ + if (PyString_Check (sym)) + { + sym_name = python_string_to_host_string (sym); + language = current_language; + if (! sym_name) goto locals_error; + } + else + { + symbol = symbol_object_to_symbol (sym); + sym_name = xstrdup (SYMBOL_PRINT_NAME (symbol)); - /* For arg name, the user can return a symbol or a - string. */ - if (PyString_Check (sym)) - { - sym_name = python_string_to_host_string (sym); - language = current_language; - if (! sym_name) - goto locals_error; - } + if (language_mode == language_mode_auto) + language = language_def (SYMBOL_LANGUAGE (symbol)); else - { - symbol = symbol_object_to_symbol (sym); - sym_name = xstrdup (SYMBOL_PRINT_NAME (symbol)); - - if (language_mode == language_mode_auto) - language = language_def (SYMBOL_LANGUAGE (symbol)); - else - language = current_language; - } - - fprintf_filtered (gdb_stdout, "%s%s = ", - n_spaces (2 * indent), sym_name); - - xfree (sym_name); - val = value_object_to_value (value); - if (! val) - { - PyErr_SetString (PyExc_RuntimeError, - _("Invalid value in frame.")); - - goto locals_error; - } - - TRY_CATCH (except, RETURN_MASK_ERROR) - { - opts.deref_ref = 1; - common_val_print (val, gdb_stdout, indent, &opts, language); - } - if (except.reason < 0) - { - PyErr_SetString (PyExc_RuntimeError, - except.message); - goto locals_error; - } - fprintf_filtered (gdb_stdout, "\n"); - - gdb_flush (gdb_stdout); + language = current_language; + } + + fprintf_filtered (gdb_stdout, "%s%s = ", + n_spaces (2 * indent), sym_name); + xfree (sym_name); + + val = value_object_to_value (value); + if (! val) + { + PyErr_SetString (PyExc_RuntimeError, + _("Invalid value in frame.")); + goto locals_error; + } + + TRY_CATCH (except, RETURN_MASK_ERROR) + { + opts.deref_ref = 1; + common_val_print (val, gdb_stdout, indent, &opts, language); + } + if (except.reason < 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + goto locals_error; } + fprintf_filtered (gdb_stdout, "\n"); + + gdb_flush (gdb_stdout); } } else goto locals_error; } - do_cleanups (old_chain); return 1; @@ -379,102 +382,100 @@ py_print_args (PyObject *filter, size = PyList_Size (result); - if (size > 0) + for (list_index = 0; list_index < size; list_index++) { - for (list_index = 0; list_index < size; list_index++) + PyObject *sym_tuple, *sym, *value; + const char *sym_name; + struct value *val; + struct symbol *symbol; + + sym_tuple = PyList_GetItem (result, list_index); + if (! sym_tuple) + goto args_error; + + if (! PyTuple_Check (sym_tuple) + && PyTuple_Size (sym_tuple) != 2) { - PyObject *sym_tuple, *sym, *value; - const char *sym_name; - struct value *val; - struct symbol *symbol; + PyErr_SetString (PyExc_RuntimeError, + _("frame_arg list must contain a Python tuple.")); + goto args_error; + } - sym_tuple = PyList_GetItem (result, list_index); - if (! sym_tuple) - goto args_error; + /* Each element in the frame arguments list should be a + tuple containing two elements. The argument name, + which can be a string or a gdb.Symbol, and the + value. */ - if (! PyTuple_Check (sym_tuple) - && PyTuple_Size (sym_tuple) != 2) - { - PyErr_SetString (PyExc_RuntimeError, - _("frame_arg list must contain a Python tuple.")); - goto args_error; - } - - /* Each element in the frame arguments list should be a - tuple containing two elements. The argument name, - which can be a string or a gdb.Symbol, and the - value. */ - - /* Name. */ - sym = PyTuple_GetItem (sym_tuple, 0); - if (! sym) - goto args_error; - - /* Value. */ - value = PyTuple_GetItem (sym_tuple, 1); - if (! value) - goto args_error; + /* Name. */ + sym = PyTuple_GetItem (sym_tuple, 0); + if (! sym) + goto args_error; - /* For arg name, the user can return a symbol or a - string. */ - if (PyString_Check (sym)) - { - sym_name = PyString_AsString (sym); - language = current_language; - if (! sym_name) - goto args_error; - } + /* Value. */ + value = PyTuple_GetItem (sym_tuple, 1); + if (! value) + goto args_error; + + /* For arg name, the user can return a symbol or a + string. */ + if (PyString_Check (sym)) + { + sym_name = PyString_AsString (sym); + language = current_language; + if (! sym_name) + goto args_error; + } + else + { + symbol = symbol_object_to_symbol (sym); + sym_name = SYMBOL_PRINT_NAME (symbol); + if (language_mode == language_mode_auto) + language = language_def (SYMBOL_LANGUAGE (symbol)); else - { - symbol = symbol_object_to_symbol (sym); - sym_name = SYMBOL_PRINT_NAME (symbol); - if (language_mode == language_mode_auto) - language = language_def (SYMBOL_LANGUAGE (symbol)); - else - language = current_language; - } - - annotate_arg_begin (); - ui_out_field_string (out, "name", sym_name); - ui_out_text (out, "="); - - val = value_object_to_value (value); - if (! val) - { - PyErr_SetString (PyExc_RuntimeError, - _("Invalid value in frame.")); - goto args_error; - } - - annotate_arg_value (value_type (val)); + language = current_language; + } - opts.deref_ref = 1; + annotate_arg_begin (); + ui_out_field_string (out, "name", sym_name); + ui_out_text (out, "="); + + val = value_object_to_value (value); + if (! val) + { + PyErr_SetString (PyExc_RuntimeError, + _("Invalid value in frame.")); + goto args_error; + } + + annotate_arg_value (value_type (val)); + + opts.deref_ref = 1; - /* True in "summary" mode, false otherwise. */ - opts.summary = !strcmp (print_args_type, "scalars"); - - TRY_CATCH (except, RETURN_MASK_ALL) - { - common_val_print (val, stb, 2, &opts, language); - } - if (except.reason > 0) - { - PyErr_SetString (PyExc_RuntimeError, - except.message); - goto args_error; - } - - ui_out_field_stream (out, "value", stb); - - if (size != 1 && list_index < size-1) - ui_out_text (out, ", "); - annotate_arg_end (); + /* True in "summary" mode, false otherwise. */ + opts.summary = !strcmp (print_args_type, "scalars"); + + TRY_CATCH (except, RETURN_MASK_ALL) + { + common_val_print (val, stb, 2, &opts, language); + } + if (except.reason > 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + goto args_error; } + + ui_out_field_stream (out, "value", stb); + + if (size != 1 && list_index < size-1) + ui_out_text (out, ", "); + annotate_arg_end (); } } else goto args_error; } + ui_out_text (out, ")"); do_cleanups (old_chain); @@ -503,28 +504,6 @@ py_print_frame (PyObject *filter, struct frame_info *frame = NULL; volatile struct gdb_exception except; - /* Get the frame. */ - if (PyObject_HasAttrString (filter, "inferior_frame")) - { - PyObject *result = PyObject_CallMethod (filter, "inferior_frame", NULL); - - if (! result) - goto error; - frame = frame_object_to_frame_info (result); - if (! frame) - { - Py_DECREF (result); - goto error; - } - gdbarch = get_frame_arch (frame); - } - else - { - PyErr_SetString (PyExc_RuntimeError, - _("frame filter must implement inferior_frame callback.")); - goto error; - } - /* First check to see if this frame is to be omitted. */ if (PyObject_HasAttrString (filter, "omit")) { @@ -555,6 +534,30 @@ py_print_frame (PyObject *filter, goto error; } + /* Get the frame. */ + if (PyObject_HasAttrString (filter, "inferior_frame")) + { + PyObject *result = PyObject_CallMethod (filter, "inferior_frame", NULL); + + if (! result) + goto error; + frame = frame_object_to_frame_info (result); + if (! frame) + { + Py_DECREF (result); + goto error; + } + + Py_DECREF (result); + gdbarch = get_frame_arch (frame); + } + else + { + PyErr_SetString (PyExc_RuntimeError, + _("frame filter must implement inferior_frame callback.")); + goto error; + } + if (PyObject_HasAttrString (filter, "elide")) { PyObject *result = PyObject_CallMethod (filter, "elide", NULL); @@ -592,7 +595,6 @@ py_print_frame (PyObject *filter, PyObject *result = PyObject_CallMethod (filter, "level", "i", frame_relative_level (frame), NULL); - if (result) { level = PyLong_AsLong (result); hooks/post-receive -- Repository for Project Archer.