gdb/python/py-lazy-string.c - gdb
Global variables defined
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "python-internal.h"
- #include "charset.h"
- #include "value.h"
- #include "valprint.h"
- #include "language.h"
- typedef struct {
- PyObject_HEAD
-
- CORE_ADDR address;
-
- char *encoding;
-
- long length;
-
- struct type *type;
- } lazy_string_object;
- static PyTypeObject lazy_string_object_type
- CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("lazy_string_object");
- static PyObject *
- stpy_get_address (PyObject *self, void *closure)
- {
- lazy_string_object *self_string = (lazy_string_object *) self;
- return gdb_py_long_from_ulongest (self_string->address);
- }
- static PyObject *
- stpy_get_encoding (PyObject *self, void *closure)
- {
- lazy_string_object *self_string = (lazy_string_object *) self;
- PyObject *result;
-
- if (self_string->encoding)
- result = PyString_FromString (self_string->encoding);
- else
- {
- result = Py_None;
- Py_INCREF (result);
- }
- return result;
- }
- static PyObject *
- stpy_get_length (PyObject *self, void *closure)
- {
- lazy_string_object *self_string = (lazy_string_object *) self;
- return PyLong_FromLong (self_string->length);
- }
- 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);
- }
- static PyObject *
- stpy_convert_to_value (PyObject *self, PyObject *args)
- {
- lazy_string_object *self_string = (lazy_string_object *) self;
- struct value *val = NULL;
- volatile struct gdb_exception except;
- if (self_string->address == 0)
- {
- PyErr_SetString (PyExc_MemoryError,
- _("Cannot create a value from NULL."));
- return NULL;
- }
- 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);
- }
- static void
- stpy_dealloc (PyObject *self)
- {
- lazy_string_object *self_string = (lazy_string_object *) self;
- xfree (self_string->encoding);
- }
- PyObject *
- gdbpy_create_lazy_string_object (CORE_ADDR address, long length,
- const char *encoding, struct type *type)
- {
- lazy_string_object *str_obj = NULL;
- if (address == 0 && length != 0)
- {
- PyErr_SetString (PyExc_MemoryError,
- _("Cannot create a lazy string with address 0x0, " \
- "and a non-zero length."));
- return NULL;
- }
- if (!type)
- {
- PyErr_SetString (PyExc_RuntimeError,
- _("A lazy string's type cannot be NULL."));
- return NULL;
- }
- str_obj = PyObject_New (lazy_string_object, &lazy_string_object_type);
- if (!str_obj)
- return NULL;
- str_obj->address = address;
- str_obj->length = length;
- if (encoding == NULL || !strcmp (encoding, ""))
- str_obj->encoding = NULL;
- else
- str_obj->encoding = xstrdup (encoding);
- str_obj->type = type;
- return (PyObject *) str_obj;
- }
- int
- gdbpy_initialize_lazy_string (void)
- {
- if (PyType_Ready (&lazy_string_object_type) < 0)
- return -1;
- Py_INCREF (&lazy_string_object_type);
- return 0;
- }
- int
- gdbpy_is_lazy_string (PyObject *result)
- {
- return PyObject_TypeCheck (result, &lazy_string_object_type);
- }
- void
- gdbpy_extract_lazy_string (PyObject *string, CORE_ADDR *addr,
- struct type **str_type,
- long *length, char **encoding)
- {
- lazy_string_object *lazy;
- gdb_assert (gdbpy_is_lazy_string (string));
- lazy = (lazy_string_object *) string;
- *addr = lazy->address;
- *str_type = lazy->type;
- *length = lazy->length;
- *encoding = lazy->encoding ? xstrdup (lazy->encoding) : NULL;
- }
- static PyMethodDef lazy_string_object_methods[] = {
- { "value", stpy_convert_to_value, METH_NOARGS,
- "Create a (lazy) value that contains a pointer to the string." },
- {NULL}
- };
- static PyGetSetDef lazy_string_object_getset[] = {
- { "address", stpy_get_address, NULL, "Address of the string.", NULL },
- { "encoding", stpy_get_encoding, NULL, "Encoding of the string.", NULL },
- { "length", stpy_get_length, NULL, "Length of the string.", NULL },
- { "type", stpy_get_type, NULL, "Type associated with the string.", NULL },
- { NULL }
- };
- static PyTypeObject lazy_string_object_type = {
- PyVarObject_HEAD_INIT (NULL, 0)
- "gdb.LazyString",
- sizeof (lazy_string_object),
- 0,
- stpy_dealloc,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- Py_TPFLAGS_DEFAULT,
- "GDB lazy string object",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- lazy_string_object_methods,
- 0,
- lazy_string_object_getset
- };