This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA 10/11] Use gdbpy_ref in py-prettyprint.c
- From: Tom Tromey <tom at tromey dot com>
- To: gdb-patches at sourceware dot org
- Cc: Tom Tromey <tom at tromey dot com>
- Date: Sat, 12 Nov 2016 14:28:44 -0700
- Subject: [RFA 10/11] Use gdbpy_ref in py-prettyprint.c
- Authentication-results: sourceware.org; auth=none
- References: <1478986125-15122-1-git-send-email-tom@tromey.com>
This changes some spots in py-prettyprint.c to use gdbpy_ref.
2016-11-12 Tom Tromey <tom@tromey.com>
* python/py-prettyprint.c (print_stack_unless_memory_error)
(print_string_repr, print_children): Use gdbpy_ref.
---
gdb/ChangeLog | 5 +++
gdb/python/py-prettyprint.c | 84 ++++++++++++++++-----------------------------
2 files changed, 34 insertions(+), 55 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 010190f..0f94b2e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2016-11-12 Tom Tromey <tom@tromey.com>
+ * python/py-prettyprint.c (print_stack_unless_memory_error)
+ (print_string_repr, print_children): Use gdbpy_ref.
+
+2016-11-12 Tom Tromey <tom@tromey.com>
+
* python/py-framefilter.c (py_print_frame): Use gdbpy_ref.
2016-11-12 Tom Tromey <tom@tromey.com>
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index e7a3e76..d7c9145 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -252,13 +252,13 @@ print_stack_unless_memory_error (struct ui_file *stream)
{
if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error))
{
- struct cleanup *cleanup;
PyObject *type, *value, *trace;
PyErr_Fetch (&type, &value, &trace);
- cleanup = make_cleanup_py_decref (type);
- make_cleanup_py_decref (value);
- make_cleanup_py_decref (trace);
+
+ gdbpy_ref type_ref (type);
+ gdbpy_ref value_ref (value);
+ gdbpy_ref trace_ref (trace);
gdb::unique_xmalloc_ptr<char>
msg (gdbpy_exception_to_string (type, value));
@@ -268,8 +268,6 @@ print_stack_unless_memory_error (struct ui_file *stream)
else
fprintf_filtered (stream, _("<error reading variable: %s>"),
msg.get ());
-
- do_cleanups (cleanup);
}
else
gdbpy_print_stack ();
@@ -286,17 +284,14 @@ print_string_repr (PyObject *printer, const char *hint,
struct gdbarch *gdbarch)
{
struct value *replacement = NULL;
- PyObject *py_str = NULL;
enum string_repr_result result = string_repr_ok;
- py_str = pretty_print_one_value (printer, &replacement);
- if (py_str)
+ gdbpy_ref py_str (pretty_print_one_value (printer, &replacement));
+ if (py_str != NULL)
{
- struct cleanup *cleanup = make_cleanup_py_decref (py_str);
-
if (py_str == Py_None)
result = string_repr_none;
- else if (gdbpy_is_lazy_string (py_str))
+ else if (gdbpy_is_lazy_string (py_str.get ()))
{
CORE_ADDR addr;
long length;
@@ -304,7 +299,7 @@ print_string_repr (PyObject *printer, const char *hint,
gdb::unique_xmalloc_ptr<char> encoding;
struct value_print_options local_opts = *options;
- gdbpy_extract_lazy_string (py_str, &addr, &type,
+ gdbpy_extract_lazy_string (py_str.get (), &addr, &type,
&length, &encoding);
local_opts.addressprint = 0;
@@ -313,22 +308,20 @@ print_string_repr (PyObject *printer, const char *hint,
}
else
{
- PyObject *string;
-
- string = python_string_to_target_python_string (py_str);
- if (string)
+ gdbpy_ref string
+ (python_string_to_target_python_string (py_str.get ()));
+ if (string != NULL)
{
char *output;
long length;
struct type *type;
- make_cleanup_py_decref (string);
#ifdef IS_PY3K
- output = PyBytes_AS_STRING (string);
- length = PyBytes_GET_SIZE (string);
+ output = PyBytes_AS_STRING (string.get ());
+ length = PyBytes_GET_SIZE (string.get ());
#else
- output = PyString_AsString (string);
- length = PyString_Size (string);
+ output = PyString_AsString (string.get ());
+ length = PyString_Size (string.get ());
#endif
type = builtin_type (gdbarch)->builtin_char;
@@ -344,8 +337,6 @@ print_string_repr (PyObject *printer, const char *hint,
print_stack_unless_memory_error (stream);
}
}
-
- do_cleanups (cleanup);
}
else if (replacement)
{
@@ -453,11 +444,9 @@ print_children (PyObject *printer, const char *hint,
{
int is_map, is_array, done_flag, pretty;
unsigned int i;
- PyObject *children, *iter;
#ifndef IS_PY3K
PyObject *frame;
#endif
- struct cleanup *cleanups;
if (! PyObject_HasAttr (printer, gdbpy_children_cst))
return;
@@ -467,23 +456,20 @@ print_children (PyObject *printer, const char *hint,
is_map = hint && ! strcmp (hint, "map");
is_array = hint && ! strcmp (hint, "array");
- children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
- NULL);
- if (! children)
+ gdbpy_ref children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
+ NULL));
+ if (children == NULL)
{
print_stack_unless_memory_error (stream);
return;
}
- cleanups = make_cleanup_py_decref (children);
-
- iter = PyObject_GetIter (children);
- if (!iter)
+ gdbpy_ref iter (PyObject_GetIter (children.get ()));
+ if (iter == NULL)
{
print_stack_unless_memory_error (stream);
- goto done;
+ return;
}
- make_cleanup_py_decref (iter);
/* Use the prettyformat_arrays option if we are printing an array,
and the pretty option otherwise. */
@@ -501,23 +487,19 @@ print_children (PyObject *printer, const char *hint,
where it insists on having a non-NULL tstate->frame when
a generator is called. */
#ifndef IS_PY3K
- frame = push_dummy_python_frame ();
- if (!frame)
- {
- gdbpy_print_stack ();
- goto done;
- }
- make_cleanup_py_decref (frame);
+ gdbpy_ref frame (push_dummy_python_frame ());
+ if (frame == NULL)
+ return;
#endif
done_flag = 0;
for (i = 0; i < options->print_max; ++i)
{
- PyObject *py_v, *item = PyIter_Next (iter);
+ PyObject *py_v;
const char *name;
- struct cleanup *inner_cleanup;
- if (! item)
+ gdbpy_ref item (PyIter_Next (iter.get ()));
+ if (item == NULL)
{
if (PyErr_Occurred ())
print_stack_unless_memory_error (stream);
@@ -528,16 +510,15 @@ print_children (PyObject *printer, const char *hint,
break;
}
- if (! PyTuple_Check (item) || PyTuple_Size (item) != 2)
+ if (! PyTuple_Check (item.get ()) || PyTuple_Size (item.get ()) != 2)
{
PyErr_SetString (PyExc_TypeError,
_("Result of children iterator not a tuple"
" of two elements."));
gdbpy_print_stack ();
- Py_DECREF (item);
continue;
}
- if (! PyArg_ParseTuple (item, "sO", &name, &py_v))
+ if (! PyArg_ParseTuple (item.get (), "sO", &name, &py_v))
{
/* The user won't necessarily get a stack trace here, so provide
more context. */
@@ -545,10 +526,8 @@ print_children (PyObject *printer, const char *hint,
fprintf_unfiltered (gdb_stderr,
_("Bad result from children iterator.\n"));
gdbpy_print_stack ();
- Py_DECREF (item);
continue;
}
- inner_cleanup = make_cleanup_py_decref (item);
/* Print initial "{". For other elements, there are three
cases:
@@ -643,8 +622,6 @@ print_children (PyObject *printer, const char *hint,
if (is_map && i % 2 == 0)
fputs_filtered ("] = ", stream);
-
- do_cleanups (inner_cleanup);
}
if (i)
@@ -665,9 +642,6 @@ print_children (PyObject *printer, const char *hint,
}
fputs_filtered ("}", stream);
}
-
- done:
- do_cleanups (cleanups);
}
enum ext_lang_rc
--
2.7.4