1 /* Python memory buffer interface for reading inferior memory.
3 Copyright (C) 2009-2023 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"
23 struct membuf_object
{
26 /* Pointer to the raw data, and array of gdb_bytes. */
29 /* The address from where the data was read, held for mbpy_str. */
32 /* The number of octets in BUFFER. */
36 extern PyTypeObject membuf_object_type
37 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("membuf_object");
39 /* Wrap BUFFER, ADDRESS, and LENGTH into a gdb.Membuf object. ADDRESS is
40 the address within the inferior that the contents of BUFFER were read,
41 and LENGTH is the number of octets in BUFFER. */
44 gdbpy_buffer_to_membuf (gdb::unique_xmalloc_ptr
<gdb_byte
> buffer
,
48 gdbpy_ref
<membuf_object
> membuf_obj (PyObject_New (membuf_object
,
49 &membuf_object_type
));
50 if (membuf_obj
== nullptr)
53 membuf_obj
->buffer
= buffer
.release ();
54 membuf_obj
->addr
= address
;
55 membuf_obj
->length
= length
;
57 return PyMemoryView_FromObject ((PyObject
*) membuf_obj
.get ());
60 /* Destructor for gdb.Membuf objects. */
63 mbpy_dealloc (PyObject
*self
)
65 xfree (((membuf_object
*) self
)->buffer
);
66 Py_TYPE (self
)->tp_free (self
);
69 /* Return a description of the gdb.Membuf object. */
72 mbpy_str (PyObject
*self
)
74 membuf_object
*membuf_obj
= (membuf_object
*) self
;
76 return PyUnicode_FromFormat (_("Memory buffer for address %s, \
77 which is %s bytes long."),
78 paddress (gdbpy_enter::get_gdbarch (),
80 pulongest (membuf_obj
->length
));
84 get_buffer (PyObject
*self
, Py_buffer
*buf
, int flags
)
86 membuf_object
*membuf_obj
= (membuf_object
*) self
;
89 ret
= PyBuffer_FillInfo (buf
, self
, membuf_obj
->buffer
,
90 membuf_obj
->length
, 0,
93 /* Despite the documentation saying this field is a "const char *",
94 in Python 3.4 at least, it's really a "char *". */
95 buf
->format
= (char *) "c";
100 /* General Python initialization callback. */
103 gdbpy_initialize_membuf (void)
105 membuf_object_type
.tp_new
= PyType_GenericNew
;
106 if (PyType_Ready (&membuf_object_type
) < 0)
109 return gdb_pymodule_addobject (gdb_module
, "Membuf",
110 (PyObject
*) &membuf_object_type
);
113 static PyBufferProcs buffer_procs
=
118 PyTypeObject membuf_object_type
= {
119 PyVarObject_HEAD_INIT (nullptr, 0)
120 "gdb.Membuf", /*tp_name*/
121 sizeof (membuf_object
), /*tp_basicsize*/
123 mbpy_dealloc
, /*tp_dealloc*/
130 0, /*tp_as_sequence*/
137 &buffer_procs
, /*tp_as_buffer*/
138 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
139 "GDB memory buffer object", /*tp_doc*/
142 0, /* tp_richcompare */
143 0, /* tp_weaklistoffset */
151 0, /* tp_descr_get */
152 0, /* tp_descr_set */
153 0, /* tp_dictoffset */