diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1dc7b32803..849c3e1c00 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-01-10 Tom Tromey + + * python/py-linetable.c (build_line_table_tuple_from_pcs) + (ltpy_get_all_source_lines): Use gdbpy_ref. + 2017-01-10 Tom Tromey * python/py-framefilter.c (extract_sym, extract_value) diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index ca1b3943a4..1f73ff77d3 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -19,6 +19,7 @@ #include "defs.h" #include "python-internal.h" +#include "py-ref.h" typedef struct { PyObject_HEAD @@ -124,7 +125,6 @@ static PyObject * build_line_table_tuple_from_pcs (int line, VEC (CORE_ADDR) *vec) { int vec_len = 0; - PyObject *tuple; CORE_ADDR pc; int i; @@ -132,31 +132,22 @@ build_line_table_tuple_from_pcs (int line, VEC (CORE_ADDR) *vec) if (vec_len < 1) Py_RETURN_NONE; - tuple = PyTuple_New (vec_len); + gdbpy_ref tuple (PyTuple_New (vec_len)); if (tuple == NULL) return NULL; for (i = 0; VEC_iterate (CORE_ADDR, vec, i, pc); ++i) { - PyObject *obj = build_linetable_entry (line, pc); + gdbpy_ref obj (build_linetable_entry (line, pc)); if (obj == NULL) - { - Py_DECREF (tuple); - tuple = NULL; - break; - } - else if (PyTuple_SetItem (tuple, i, obj) != 0) - { - Py_DECREF (obj); - Py_DECREF (tuple); - tuple = NULL; - break; - } + return NULL; + else if (PyTuple_SetItem (tuple.get (), i, obj.release ()) != 0) + return NULL; } - return tuple; + return tuple.release (); } /* Implementation of gdb.LineTable.line (self) -> Tuple. Returns a @@ -236,7 +227,6 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args) { struct symtab *symtab; Py_ssize_t index; - PyObject *source_list, *source_dict, *line; struct linetable_entry *item; LTPY_REQUIRE_VALID (self, symtab); @@ -248,7 +238,7 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args) return NULL; } - source_dict = PyDict_New (); + gdbpy_ref source_dict (PyDict_New ()); if (source_dict == NULL) return NULL; @@ -260,30 +250,17 @@ ltpy_get_all_source_lines (PyObject *self, PyObject *args) include in the source set. */ if (item->line > 0) { - line = gdb_py_object_from_longest (item->line); + gdbpy_ref line (gdb_py_object_from_longest (item->line)); if (line == NULL) - { - Py_DECREF (source_dict); - return NULL; - } + return NULL; - if (PyDict_SetItem (source_dict, line, Py_None) == -1) - { - Py_DECREF (line); - Py_DECREF (source_dict); - return NULL; - } - - Py_DECREF (line); + if (PyDict_SetItem (source_dict.get (), line.get (), Py_None) == -1) + return NULL; } } - - source_list = PyDict_Keys (source_dict); - Py_DECREF (source_dict); - - return source_list; + return PyDict_Keys (source_dict.get ()); } /* Implementation of gdb.LineTable.is_valid (self) -> Boolean.