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-lazy-string.c | |
parent | gdb/ (diff) | |
download | binutils-gdb-09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415.tar.gz binutils-gdb-09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415.tar.bz2 binutils-gdb-09ca9e2e34b93e8e12d6a0a4bad469b2b4c2f415.zip |
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-lazy-string.c')
-rw-r--r-- | gdb/python/py-lazy-string.c | 93 |
1 files changed, 17 insertions, 76 deletions
diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c index 23cf13a0577..a7ef69f8c54 100644 --- a/gdb/python/py-lazy-string.c +++ b/gdb/python/py-lazy-string.c @@ -24,6 +24,7 @@ #include "exceptions.h" #include "valprint.h" #include "language.h" +#include "gdb_assert.h" typedef struct { PyObject_HEAD @@ -169,86 +170,26 @@ gdbpy_is_lazy_string (PyObject *result) return PyObject_TypeCheck (result, &lazy_string_object_type); } -/* Extract and return the actual string from the lazy string object - STRING. Addtionally, the string type is written to *STR_TYPE, the - string length is written to *LENGTH, and the string encoding is - written to *ENCODING. On error, NULL is returned. The caller is - responsible for freeing the returned buffer. */ -gdb_byte * -gdbpy_extract_lazy_string (PyObject *string, struct type **str_type, - long *length, char **encoding) -{ - int width; - int bytes_read; - gdb_byte *buffer = NULL; - int errcode = 0; - CORE_ADDR addr; - struct gdbarch *gdbarch; - enum bfd_endian byte_order; - PyObject *py_len = NULL, *py_encoding = NULL; - PyObject *py_addr = NULL, *py_type = NULL; - volatile struct gdb_exception except; - - py_len = PyObject_GetAttrString (string, "length"); - py_encoding = PyObject_GetAttrString (string, "encoding"); - py_addr = PyObject_GetAttrString (string, "address"); - py_type = PyObject_GetAttrString (string, "type"); - - /* A NULL encoding, length, address or type is not ok. */ - if (!py_len || !py_encoding || !py_addr || !py_type) - goto error; - - *length = PyLong_AsLong (py_len); - addr = PyLong_AsUnsignedLongLong (py_addr); - - /* If the user supplies Py_None an encoding, set encoding to NULL. - This will trigger the resulting LA_PRINT_CALL to automatically - select an encoding. */ - if (py_encoding == Py_None) - *encoding = NULL; - else - *encoding = xstrdup (PyString_AsString (py_encoding)); +/* Extract the parameters from the lazy string object STRING. + ENCODING will either be set to NULL, or will be allocated with + xmalloc, in which case the callers is responsible for freeing + it. */ - *str_type = type_object_to_type (py_type); - gdbarch = get_type_arch (*str_type); - byte_order = gdbarch_byte_order (gdbarch); - width = TYPE_LENGTH (*str_type); +void +gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr, + struct type **str_type, + long *length, char **encoding) +{ + lazy_string_object *lazy; - TRY_CATCH (except, RETURN_MASK_ALL) - { - errcode = read_string (addr, *length, width, - *length, byte_order, &buffer, - &bytes_read); - } - if (except.reason < 0) - { - PyErr_Format (except.reason == RETURN_QUIT \ - ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \ - "%s", except.message); \ - goto error; + gdb_assert (gdbpy_is_lazy_string (string)); - } + lazy = (lazy_string_object *) string; - if (errcode) - goto error; - - *length = bytes_read / width; - - Py_DECREF (py_encoding); - Py_DECREF (py_len); - Py_DECREF (py_addr); - Py_DECREF (py_type); - return buffer; - - error: - Py_XDECREF (py_encoding); - Py_XDECREF (py_len); - Py_XDECREF (py_addr); - Py_XDECREF (py_type); - xfree (buffer); - *length = 0; - *str_type = NULL; - return NULL; + *addr = lazy->address; + *str_type = lazy->type; + *length = lazy->length; + *encoding = lazy->encoding ? xstrdup (lazy->encoding) : NULL; } |