1 /* Python interface to lazy strings.
3 Copyright (C) 2010 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "python-internal.h"
24 #include "exceptions.h"
30 /* Holds the address of the lazy string. */
33 /* Holds the encoding that will be applied to the string
34 when the string is printed by GDB. If the encoding is set
35 to None then GDB will select the most appropriate
36 encoding when the sting is printed. */
39 /* Holds the length of the string in characters. If the
40 length is -1, then the string will be fetched and encoded up to
41 the first null of appropriate width. */
44 /* This attribute holds the type that is represented by the lazy
49 static PyTypeObject lazy_string_object_type;
52 stpy_get_address (PyObject *self, void *closure)
54 lazy_string_object *self_string = (lazy_string_object *) self;
56 return PyLong_FromUnsignedLongLong (self_string->address);
60 stpy_get_encoding (PyObject *self, void *closure)
62 lazy_string_object *self_string = (lazy_string_object *) self;
65 /* An encoding can be set to NULL by the user, so check before
66 attempting a Python FromString call. If NULL return Py_None. */
67 if (self_string->encoding)
68 result = PyString_FromString (self_string->encoding);
79 stpy_get_length (PyObject *self, void *closure)
81 lazy_string_object *self_string = (lazy_string_object *) self;
83 return PyLong_FromLong (self_string->length);
87 stpy_get_type (PyObject *self, void *closure)
89 lazy_string_object *str_obj = (lazy_string_object *) self;
91 return type_to_type_object (str_obj->type);
95 stpy_convert_to_value (PyObject *self, PyObject *args)
97 lazy_string_object *self_string = (lazy_string_object *) self;
100 if (self_string->address == 0)
102 PyErr_SetString (PyExc_MemoryError,
103 _("Cannot create a value from NULL."));
107 val = value_at_lazy (self_string->type, self_string->address);
108 return value_to_value_object (val);
112 stpy_dealloc (PyObject *self)
114 lazy_string_object *self_string = (lazy_string_object *) self;
116 xfree (self_string->encoding);
120 gdbpy_create_lazy_string_object (CORE_ADDR address, long length,
121 const char *encoding, struct type *type)
123 lazy_string_object *str_obj = NULL;
125 if (address == 0 && length != 0)
127 PyErr_SetString (PyExc_MemoryError,
128 _("Cannot create a lazy string with address 0x0, " \
129 "and a non-zero length."));
135 PyErr_SetString (PyExc_RuntimeError,
136 _("A lazy string's type cannot be NULL."));
140 str_obj = PyObject_New (lazy_string_object, &lazy_string_object_type);
144 str_obj->address = address;
145 str_obj->length = length;
146 if (encoding == NULL || !strcmp (encoding, ""))
147 str_obj->encoding = NULL;
149 str_obj->encoding = xstrdup (encoding);
150 str_obj->type = type;
152 return (PyObject *) str_obj;
156 gdbpy_initialize_lazy_string (void)
158 if (PyType_Ready (&lazy_string_object_type) < 0)
161 Py_INCREF (&lazy_string_object_type);
164 /* Determine whether the printer object pointed to by OBJ is a
165 Python lazy string. */
167 gdbpy_is_lazy_string (PyObject *result)
169 return PyObject_TypeCheck (result, &lazy_string_object_type);
172 /* Extract and return the actual string from the lazy string object
173 STRING. Addtionally, the string type is written to *STR_TYPE, the
174 string length is written to *LENGTH, and the string encoding is
175 written to *ENCODING. On error, NULL is returned. The caller is
176 responsible for freeing the returned buffer. */
178 gdbpy_extract_lazy_string (PyObject *string, struct type **str_type,
179 long *length, char **encoding)
183 gdb_byte *buffer = NULL;
186 struct gdbarch *gdbarch;
187 enum bfd_endian byte_order;
188 PyObject *py_len = NULL, *py_encoding = NULL;
189 PyObject *py_addr = NULL, *py_type = NULL;
190 volatile struct gdb_exception except;
192 py_len = PyObject_GetAttrString (string, "length");
193 py_encoding = PyObject_GetAttrString (string, "encoding");
194 py_addr = PyObject_GetAttrString (string, "address");
195 py_type = PyObject_GetAttrString (string, "type");
197 /* A NULL encoding, length, address or type is not ok. */
198 if (!py_len || !py_encoding || !py_addr || !py_type)
201 *length = PyLong_AsLong (py_len);
202 addr = PyLong_AsUnsignedLongLong (py_addr);
204 /* If the user supplies Py_None an encoding, set encoding to NULL.
205 This will trigger the resulting LA_PRINT_CALL to automatically
206 select an encoding. */
207 if (py_encoding == Py_None)
210 *encoding = xstrdup (PyString_AsString (py_encoding));
212 *str_type = type_object_to_type (py_type);
213 gdbarch = get_type_arch (*str_type);
214 byte_order = gdbarch_byte_order (gdbarch);
215 width = TYPE_LENGTH (*str_type);
217 TRY_CATCH (except, RETURN_MASK_ALL)
219 errcode = read_string (addr, *length, width,
220 *length, byte_order, &buffer,
223 if (except.reason < 0)
225 PyErr_Format (except.reason == RETURN_QUIT \
226 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \
227 "%s", except.message); \
235 *length = bytes_read / width;
237 Py_DECREF (py_encoding);
244 Py_XDECREF (py_encoding);
246 Py_XDECREF (py_addr);
247 Py_XDECREF (py_type);
256 static PyMethodDef lazy_string_object_methods[] = {
257 { "value", stpy_convert_to_value, METH_NOARGS,
258 "Create a (lazy) value that contains a pointer to the string." },
259 {NULL} /* Sentinel */
263 static PyGetSetDef lazy_string_object_getset[] = {
264 { "address", stpy_get_address, NULL, "Address of the string.", NULL },
265 { "encoding", stpy_get_encoding, NULL, "Encoding of the string.", NULL },
266 { "length", stpy_get_length, NULL, "Length of the string.", NULL },
267 { "type", stpy_get_type, NULL, "Type associated with the string.", NULL },
268 { NULL } /* Sentinel */
271 static PyTypeObject lazy_string_object_type = {
272 PyObject_HEAD_INIT (NULL)
274 "gdb.LazyString", /*tp_name*/
275 sizeof (lazy_string_object), /*tp_basicsize*/
277 stpy_dealloc, /*tp_dealloc*/
284 0, /*tp_as_sequence*/
292 Py_TPFLAGS_DEFAULT, /*tp_flags*/
293 "GDB lazy string object", /* tp_doc */
296 0, /* tp_richcompare */
297 0, /* tp_weaklistoffset */
300 lazy_string_object_methods, /* tp_methods */
302 lazy_string_object_getset /* tp_getset */