X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/f5f8b5baf4e8df45804583c7a8494b1f257cc0ed..b9516fa158d68eedaa9e2191e38e7a1acfcfee77:/gdb/python/py-lazy-string.c diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c index ebe0a99a3b..3c908296f2 100644 --- a/gdb/python/py-lazy-string.c +++ b/gdb/python/py-lazy-string.c @@ -1,6 +1,6 @@ /* Python interface to lazy strings. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -24,6 +24,7 @@ #include "exceptions.h" #include "valprint.h" #include "language.h" +#include "gdb_assert.h" typedef struct { PyObject_HEAD @@ -52,7 +53,8 @@ static PyObject * stpy_get_address (PyObject *self, void *closure) { lazy_string_object *self_string = (lazy_string_object *) self; - return PyLong_FromUnsignedLongLong (self_string->address); + + return gdb_py_long_from_ulongest (self_string->address); } static PyObject * @@ -78,13 +80,15 @@ static PyObject * stpy_get_length (PyObject *self, void *closure) { lazy_string_object *self_string = (lazy_string_object *) self; + return PyLong_FromLong (self_string->length); } -PyObject * +static PyObject * stpy_get_type (PyObject *self, void *closure) { lazy_string_object *str_obj = (lazy_string_object *) self; + return type_to_type_object (str_obj->type); } @@ -92,16 +96,22 @@ static PyObject * stpy_convert_to_value (PyObject *self, PyObject *args) { lazy_string_object *self_string = (lazy_string_object *) self; - struct value *val; + struct value *val = NULL; + volatile struct gdb_exception except; if (self_string->address == 0) { PyErr_SetString (PyExc_MemoryError, - _("Cannot create a value from NULL")); + _("Cannot create a value from NULL.")); return NULL; } - val = value_at_lazy (self_string->type, self_string->address); + TRY_CATCH (except, RETURN_MASK_ALL) + { + val = value_at_lazy (self_string->type, self_string->address); + } + GDB_PY_HANDLE_EXCEPTION (except); + return value_to_value_object (val); } @@ -109,6 +119,7 @@ static void stpy_dealloc (PyObject *self) { lazy_string_object *self_string = (lazy_string_object *) self; + xfree (self_string->encoding); } @@ -129,7 +140,7 @@ gdbpy_create_lazy_string_object (CORE_ADDR address, long length, if (!type) { PyErr_SetString (PyExc_RuntimeError, - "A lazy string's type cannot be NULL."); + _("A lazy string's type cannot be NULL.")); return NULL; } @@ -165,86 +176,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; +/* 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. */ - 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)); - - *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; }