aboutsummaryrefslogtreecommitdiff
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-lazy-string.c
parentgdb/ (diff)
downloadbinutils-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.c93
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;
}