summaryrefslogtreecommitdiff
path: root/gdb/python/py-prettyprint.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2010-10-15 18:54:13 +0000
committerTom Tromey <tromey@redhat.com>2010-10-15 18:54:13 +0000
commit09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415 (patch)
tree27415ab68602f61368e4773b277271eda76fb144 /gdb/python/py-prettyprint.c
parent92163a10dcb34785a2fc74a05c3e890fbe700731 (diff)
downloadbinutils-gdb-09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415.tar.gz
PR python/11948:
* varobj.c (value_get_print_value): Use val_print_string to print lazy strings. * python/py-prettyprint.c (print_string_repr): Use val_print_string to print lazy strings. Fix cleanup logic. (print_children): Likewise. * python/python-internal.h (gdbpy_extract_lazy_string): Update. * python/py-lazy-string.c (gdbpy_extract_lazy_string): Rewrite. Change return type to 'void', add 'addr' argument. * value.h (val_print_string): Update. * valprint.c (val_print_string): Add 'encoding' argument. * printcmd.c (print_formatted): Update. * p-valprint.c (pascal_val_print): Update. * m2-valprint.c (print_unpacked_pointer): Update. (m2_print_array_contents): Likewise. * jv-valprint.c (java_value_print): Update. * f-valprint.c (f_val_print): Update. * c-valprint.c (c_val_print): Update. * auxv.c (fprint_target_auxv): Update.
Diffstat (limited to 'gdb/python/py-prettyprint.c')
-rw-r--r--gdb/python/py-prettyprint.c105
1 files changed, 51 insertions, 54 deletions
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index cc6a346716f..37c407843d0 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -275,53 +275,51 @@ print_string_repr (PyObject *printer, const char *hint,
py_str = pretty_print_one_value (printer, &replacement);
if (py_str)
{
+ struct cleanup *cleanup = make_cleanup_py_decref (py_str);
+
if (py_str == Py_None)
is_py_none = 1;
- else
+ else if (gdbpy_is_lazy_string (py_str))
{
- gdb_byte *output = NULL;
+ CORE_ADDR addr;
long length;
struct type *type;
char *encoding = NULL;
- PyObject *string = NULL;
- int is_lazy;
- is_lazy = gdbpy_is_lazy_string (py_str);
- if (is_lazy)
- output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding);
- else
- {
- string = python_string_to_target_python_string (py_str);
- if (string)
- {
- output = PyString_AsString (string);
- length = PyString_Size (string);
- type = builtin_type (gdbarch)->builtin_char;
- }
- else
- gdbpy_print_stack ();
-
- }
-
- if (output)
+ make_cleanup (free_current_contents, &encoding);
+ gdbpy_extract_lazy_string (py_str, &addr, &type,
+ &length, &encoding);
+
+ val_print_string (type, encoding, addr, (int) length,
+ stream, options);
+ }
+ else
+ {
+ PyObject *string;
+
+ string = python_string_to_target_python_string (py_str);
+ if (string)
{
- if (is_lazy || (hint && !strcmp (hint, "string")))
- LA_PRINT_STRING (stream, type, output, length, encoding,
+ gdb_byte *output;
+ long length;
+ struct type *type;
+
+ make_cleanup_py_decref (string);
+ output = PyString_AsString (string);
+ length = PyString_Size (string);
+ type = builtin_type (gdbarch)->builtin_char;
+
+ if (hint && !strcmp (hint, "string"))
+ LA_PRINT_STRING (stream, type, output, length, NULL,
0, options);
else
fputs_filtered (output, stream);
}
else
gdbpy_print_stack ();
-
- if (string)
- Py_DECREF (string);
- else
- xfree (output);
-
- xfree (encoding);
- Py_DECREF (py_str);
}
+
+ do_cleanups (cleanup);
}
else if (replacement)
{
@@ -548,32 +546,31 @@ print_children (PyObject *printer, const char *hint,
fputs_filtered (" = ", stream);
}
- if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v))
+ if (gdbpy_is_lazy_string (py_v))
{
- gdb_byte *output = NULL;
+ CORE_ADDR addr;
+ struct type *type;
+ long length;
+ char *encoding = NULL;
- if (gdbpy_is_lazy_string (py_v))
- {
- struct type *type;
- long length;
- char *encoding = NULL;
-
- output = gdbpy_extract_lazy_string (py_v, &type,
- &length, &encoding);
- if (!output)
- gdbpy_print_stack ();
- LA_PRINT_STRING (stream, type, output, length, encoding,
- 0, options);
- xfree (encoding);
- xfree (output);
- }
+ make_cleanup (free_current_contents, &encoding);
+ gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding);
+
+ val_print_string (type, encoding, addr, (int) length, stream,
+ options);
+
+ do_cleanups (inner_cleanup);
+ }
+ else if (gdbpy_is_string (py_v))
+ {
+ gdb_byte *output;
+
+ output = python_string_to_host_string (py_v);
+ if (!output)
+ gdbpy_print_stack ();
else
{
- output = python_string_to_host_string (py_v);
- if (!output)
- gdbpy_print_stack ();
- else
- fputs_filtered (output, stream);
+ fputs_filtered (output, stream);
xfree (output);
}
}