diff options
author | Tom Tromey <tromey@redhat.com> | 2010-10-15 18:54:13 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-10-15 18:54:13 +0000 |
commit | 09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415 (patch) | |
tree | 27415ab68602f61368e4773b277271eda76fb144 /gdb/python/py-prettyprint.c | |
parent | 92163a10dcb34785a2fc74a05c3e890fbe700731 (diff) | |
download | binutils-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.c | 105 |
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); } } |