1 /* Python interface to inferiors.
3 Copyright (C) 2009-2017 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/>. */
22 #include "gdbthread.h"
26 #include "python-internal.h"
27 #include "arch-utils.h"
29 #include "gdb_signals.h"
31 #include "py-stopevent.h"
33 extern PyTypeObject new_thread_event_object_type
34 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
35 extern PyTypeObject new_inferior_event_object_type
36 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
37 extern PyTypeObject inferior_deleted_event_object_type
38 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
40 struct threadlist_entry
{
41 thread_object
*thread_obj
;
42 struct threadlist_entry
*next
;
49 /* The inferior we represent. */
50 struct inferior
*inferior
;
52 /* thread_object instances under this inferior. This list owns a
53 reference to each object it contains. */
54 struct threadlist_entry
*threads
;
56 /* Number of threads in the list. */
60 extern PyTypeObject inferior_object_type
61 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object");
63 static const struct inferior_data
*infpy_inf_data_key
;
69 /* These are kept just for mbpy_str. */
74 extern PyTypeObject membuf_object_type
75 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("membuf_object");
77 /* Require that INFERIOR be a valid inferior ID. */
78 #define INFPY_REQUIRE_VALID(Inferior) \
80 if (!Inferior->inferior) \
82 PyErr_SetString (PyExc_RuntimeError, \
83 _("Inferior no longer exists.")); \
89 python_on_normal_stop (struct bpstats
*bs
, int print_frame
)
91 enum gdb_signal stop_signal
;
93 if (!gdb_python_initialized
)
96 if (!find_thread_ptid (inferior_ptid
))
99 stop_signal
= inferior_thread ()->suspend
.stop_signal
;
101 gdbpy_enter
enter_py (get_current_arch (), current_language
);
103 if (emit_stop_event (bs
, stop_signal
) < 0)
104 gdbpy_print_stack ();
108 python_on_resume (ptid_t ptid
)
110 if (!gdb_python_initialized
)
113 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
115 if (emit_continue_event (ptid
) < 0)
116 gdbpy_print_stack ();
119 /* Callback, registered as an observer, that notifies Python listeners
120 when an inferior function call is about to be made. */
123 python_on_inferior_call_pre (ptid_t thread
, CORE_ADDR address
)
125 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
127 if (emit_inferior_call_event (INFERIOR_CALL_PRE
, thread
, address
) < 0)
128 gdbpy_print_stack ();
131 /* Callback, registered as an observer, that notifies Python listeners
132 when an inferior function call has completed. */
135 python_on_inferior_call_post (ptid_t thread
, CORE_ADDR address
)
137 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
139 if (emit_inferior_call_event (INFERIOR_CALL_POST
, thread
, address
) < 0)
140 gdbpy_print_stack ();
143 /* Callback, registered as an observer, that notifies Python listeners
144 when a part of memory has been modified by user action (eg via a
148 python_on_memory_change (struct inferior
*inferior
, CORE_ADDR addr
, ssize_t len
, const bfd_byte
*data
)
150 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
152 if (emit_memory_changed_event (addr
, len
) < 0)
153 gdbpy_print_stack ();
156 /* Callback, registered as an observer, that notifies Python listeners
157 when a register has been modified by user action (eg via a 'set'
161 python_on_register_change (struct frame_info
*frame
, int regnum
)
163 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
165 if (emit_register_changed_event (frame
, regnum
) < 0)
166 gdbpy_print_stack ();
170 python_inferior_exit (struct inferior
*inf
)
172 const LONGEST
*exit_code
= NULL
;
174 if (!gdb_python_initialized
)
177 gdbpy_enter
enter_py (target_gdbarch (), current_language
);
179 if (inf
->has_exit_code
)
180 exit_code
= &inf
->exit_code
;
182 if (emit_exited_event (exit_code
, inf
) < 0)
183 gdbpy_print_stack ();
186 /* Callback used to notify Python listeners about new objfiles loaded in the
187 inferior. OBJFILE may be NULL which means that the objfile list has been
188 cleared (emptied). */
191 python_new_objfile (struct objfile
*objfile
)
193 if (!gdb_python_initialized
)
196 gdbpy_enter
enter_py (objfile
!= NULL
197 ? get_objfile_arch (objfile
)
203 if (emit_clear_objfiles_event () < 0)
204 gdbpy_print_stack ();
208 if (emit_new_objfile_event (objfile
) < 0)
209 gdbpy_print_stack ();
213 /* Return a reference to the Python object of type Inferior
214 representing INFERIOR. If the object has already been created,
215 return it and increment the reference count, otherwise, create it.
216 Return NULL on failure. */
218 inferior_to_inferior_object (struct inferior
*inferior
)
220 inferior_object
*inf_obj
;
222 inf_obj
= (inferior_object
*) inferior_data (inferior
, infpy_inf_data_key
);
225 inf_obj
= PyObject_New (inferior_object
, &inferior_object_type
);
229 inf_obj
->inferior
= inferior
;
230 inf_obj
->threads
= NULL
;
231 inf_obj
->nthreads
= 0;
233 /* PyObject_New initializes the new object with a refcount of 1. This
234 counts for the reference we are keeping in the inferior data. */
235 set_inferior_data (inferior
, infpy_inf_data_key
, inf_obj
);
239 /* We are returning a new reference. */
240 Py_INCREF ((PyObject
*)inf_obj
);
242 return (PyObject
*) inf_obj
;
245 /* Called when a new inferior is created. Notifies any Python event
248 python_new_inferior (struct inferior
*inf
)
250 if (!gdb_python_initialized
)
253 gdbpy_enter
enter_py (python_gdbarch
, python_language
);
255 if (evregpy_no_listeners_p (gdb_py_events
.new_inferior
))
258 gdbpy_ref
<> inf_obj (inferior_to_inferior_object (inf
));
261 gdbpy_print_stack ();
265 gdbpy_ref
<> event (create_event_object (&new_inferior_event_object_type
));
267 || evpy_add_attribute (event
.get (), "inferior", inf_obj
.get ()) < 0
268 || evpy_emit_event (event
.get (), gdb_py_events
.new_inferior
) < 0)
269 gdbpy_print_stack ();
272 /* Called when an inferior is removed. Notifies any Python event
275 python_inferior_deleted (struct inferior
*inf
)
277 if (!gdb_python_initialized
)
280 gdbpy_enter
enter_py (python_gdbarch
, python_language
);
282 if (evregpy_no_listeners_p (gdb_py_events
.inferior_deleted
))
285 gdbpy_ref
<> inf_obj (inferior_to_inferior_object (inf
));
288 gdbpy_print_stack ();
292 gdbpy_ref
<> event (create_event_object (&inferior_deleted_event_object_type
));
294 || evpy_add_attribute (event
.get (), "inferior", inf_obj
.get ()) < 0
295 || evpy_emit_event (event
.get (), gdb_py_events
.inferior_deleted
) < 0)
296 gdbpy_print_stack ();
299 /* Finds the Python Inferior object for the given PID. Returns a
300 reference, or NULL if PID does not match any inferior object. */
303 find_inferior_object (int pid
)
305 struct inferior
*inf
= find_inferior_pid (pid
);
308 return inferior_to_inferior_object (inf
);
314 find_thread_object (ptid_t ptid
)
317 struct threadlist_entry
*thread
;
319 pid
= ptid_get_pid (ptid
);
323 gdbpy_ref
<> inf_obj (find_inferior_object (pid
));
327 for (thread
= ((inferior_object
*)(inf_obj
.get ()))->threads
; thread
;
328 thread
= thread
->next
)
329 if (ptid_equal (thread
->thread_obj
->thread
->ptid
, ptid
))
330 return thread
->thread_obj
;
336 add_thread_object (struct thread_info
*tp
)
338 thread_object
*thread_obj
;
339 inferior_object
*inf_obj
;
340 struct threadlist_entry
*entry
;
342 if (!gdb_python_initialized
)
345 gdbpy_enter
enter_py (python_gdbarch
, python_language
);
347 thread_obj
= create_thread_object (tp
);
350 gdbpy_print_stack ();
354 inf_obj
= (inferior_object
*) thread_obj
->inf_obj
;
356 entry
= XNEW (struct threadlist_entry
);
357 entry
->thread_obj
= thread_obj
;
358 entry
->next
= inf_obj
->threads
;
360 inf_obj
->threads
= entry
;
363 if (evregpy_no_listeners_p (gdb_py_events
.new_thread
))
366 gdbpy_ref
<> event (create_thread_event_object (&new_thread_event_object_type
,
367 (PyObject
*) thread_obj
));
369 || evpy_emit_event (event
.get (), gdb_py_events
.new_thread
) < 0)
370 gdbpy_print_stack ();
374 delete_thread_object (struct thread_info
*tp
, int ignore
)
376 struct threadlist_entry
**entry
, *tmp
;
378 if (!gdb_python_initialized
)
381 gdbpy_enter
enter_py (python_gdbarch
, python_language
);
383 gdbpy_ref
<inferior_object
> inf_obj
384 ((inferior_object
*) find_inferior_object (ptid_get_pid (tp
->ptid
)));
388 /* Find thread entry in its inferior's thread_list. */
389 for (entry
= &inf_obj
->threads
; *entry
!= NULL
; entry
=
391 if ((*entry
)->thread_obj
->thread
== tp
)
398 tmp
->thread_obj
->thread
= NULL
;
400 *entry
= (*entry
)->next
;
403 Py_DECREF (tmp
->thread_obj
);
408 infpy_threads (PyObject
*self
, PyObject
*args
)
411 struct threadlist_entry
*entry
;
412 inferior_object
*inf_obj
= (inferior_object
*) self
;
415 INFPY_REQUIRE_VALID (inf_obj
);
419 update_thread_list ();
421 CATCH (except
, RETURN_MASK_ALL
)
423 GDB_PY_HANDLE_EXCEPTION (except
);
427 tuple
= PyTuple_New (inf_obj
->nthreads
);
431 for (i
= 0, entry
= inf_obj
->threads
; i
< inf_obj
->nthreads
;
432 i
++, entry
= entry
->next
)
434 Py_INCREF (entry
->thread_obj
);
435 PyTuple_SET_ITEM (tuple
, i
, (PyObject
*) entry
->thread_obj
);
442 infpy_get_num (PyObject
*self
, void *closure
)
444 inferior_object
*inf
= (inferior_object
*) self
;
446 INFPY_REQUIRE_VALID (inf
);
448 return PyLong_FromLong (inf
->inferior
->num
);
452 infpy_get_pid (PyObject
*self
, void *closure
)
454 inferior_object
*inf
= (inferior_object
*) self
;
456 INFPY_REQUIRE_VALID (inf
);
458 return PyLong_FromLong (inf
->inferior
->pid
);
462 infpy_get_was_attached (PyObject
*self
, void *closure
)
464 inferior_object
*inf
= (inferior_object
*) self
;
466 INFPY_REQUIRE_VALID (inf
);
467 if (inf
->inferior
->attach_flag
)
473 build_inferior_list (struct inferior
*inf
, void *arg
)
475 PyObject
*list
= (PyObject
*) arg
;
476 gdbpy_ref
<> inferior (inferior_to_inferior_object (inf
));
478 if (inferior
== NULL
)
481 return PyList_Append (list
, inferior
.get ()) ? 1 : 0;
484 /* Implementation of gdb.inferiors () -> (gdb.Inferior, ...).
485 Returns a tuple of all inferiors. */
487 gdbpy_inferiors (PyObject
*unused
, PyObject
*unused2
)
489 gdbpy_ref
<> list (PyList_New (0));
493 if (iterate_over_inferiors (build_inferior_list
, list
.get ()))
496 return PyList_AsTuple (list
.get ());
499 /* Membuf and memory manipulation. */
501 /* Implementation of Inferior.read_memory (address, length).
502 Returns a Python buffer object with LENGTH bytes of the inferior's
503 memory at ADDRESS. Both arguments are integers. Returns NULL on error,
504 with a python exception set. */
506 infpy_read_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
508 CORE_ADDR addr
, length
;
509 gdb_byte
*buffer
= NULL
;
510 PyObject
*addr_obj
, *length_obj
, *result
;
511 static const char *keywords
[] = { "address", "length", NULL
};
513 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "OO", keywords
,
514 &addr_obj
, &length_obj
))
517 if (get_addr_from_python (addr_obj
, &addr
) < 0
518 || get_addr_from_python (length_obj
, &length
) < 0)
523 buffer
= (gdb_byte
*) xmalloc (length
);
525 read_memory (addr
, buffer
, length
);
527 CATCH (except
, RETURN_MASK_ALL
)
530 GDB_PY_HANDLE_EXCEPTION (except
);
534 gdbpy_ref
<membuf_object
> membuf_obj (PyObject_New (membuf_object
,
535 &membuf_object_type
));
536 if (membuf_obj
== NULL
)
542 membuf_obj
->buffer
= buffer
;
543 membuf_obj
->addr
= addr
;
544 membuf_obj
->length
= length
;
547 result
= PyMemoryView_FromObject ((PyObject
*) membuf_obj
.get ());
549 result
= PyBuffer_FromReadWriteObject ((PyObject
*) membuf_obj
.get (), 0,
556 /* Implementation of Inferior.write_memory (address, buffer [, length]).
557 Writes the contents of BUFFER (a Python object supporting the read
558 buffer protocol) at ADDRESS in the inferior's memory. Write LENGTH
559 bytes from BUFFER, or its entire contents if the argument is not
560 provided. The function returns nothing. Returns NULL on error, with
561 a python exception set. */
563 infpy_write_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
565 struct gdb_exception except
= exception_none
;
567 const gdb_byte
*buffer
;
568 CORE_ADDR addr
, length
;
569 PyObject
*addr_obj
, *length_obj
= NULL
;
570 static const char *keywords
[] = { "address", "buffer", "length", NULL
};
574 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "Os*|O", keywords
,
575 &addr_obj
, &pybuf
, &length_obj
))
578 buffer
= (const gdb_byte
*) pybuf
.buf
;
581 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "Os#|O", keywords
,
582 &addr_obj
, &buffer
, &buf_len
,
586 buffer
= (const gdb_byte
*) buffer
;
589 if (get_addr_from_python (addr_obj
, &addr
) < 0)
594 else if (get_addr_from_python (length_obj
, &length
) < 0)
599 write_memory_with_notification (addr
, buffer
, length
);
601 CATCH (ex
, RETURN_MASK_ALL
)
608 PyBuffer_Release (&pybuf
);
610 GDB_PY_HANDLE_EXCEPTION (except
);
616 PyBuffer_Release (&pybuf
);
621 /* Destructor of Membuf objects. */
623 mbpy_dealloc (PyObject
*self
)
625 xfree (((membuf_object
*) self
)->buffer
);
626 Py_TYPE (self
)->tp_free (self
);
629 /* Return a description of the Membuf object. */
631 mbpy_str (PyObject
*self
)
633 membuf_object
*membuf_obj
= (membuf_object
*) self
;
635 return PyString_FromFormat (_("Memory buffer for address %s, \
636 which is %s bytes long."),
637 paddress (python_gdbarch
, membuf_obj
->addr
),
638 pulongest (membuf_obj
->length
));
644 get_buffer (PyObject
*self
, Py_buffer
*buf
, int flags
)
646 membuf_object
*membuf_obj
= (membuf_object
*) self
;
649 ret
= PyBuffer_FillInfo (buf
, self
, membuf_obj
->buffer
,
650 membuf_obj
->length
, 0,
653 /* Despite the documentation saying this field is a "const char *",
654 in Python 3.4 at least, it's really a "char *". */
655 buf
->format
= (char *) "c";
663 get_read_buffer (PyObject
*self
, Py_ssize_t segment
, void **ptrptr
)
665 membuf_object
*membuf_obj
= (membuf_object
*) self
;
669 PyErr_SetString (PyExc_SystemError
,
670 _("The memory buffer supports only one segment."));
674 *ptrptr
= membuf_obj
->buffer
;
676 return membuf_obj
->length
;
680 get_write_buffer (PyObject
*self
, Py_ssize_t segment
, void **ptrptr
)
682 return get_read_buffer (self
, segment
, ptrptr
);
686 get_seg_count (PyObject
*self
, Py_ssize_t
*lenp
)
689 *lenp
= ((membuf_object
*) self
)->length
;
695 get_char_buffer (PyObject
*self
, Py_ssize_t segment
, char **ptrptr
)
700 ret
= get_read_buffer (self
, segment
, &ptr
);
701 *ptrptr
= (char *) ptr
;
709 gdb.search_memory (address, length, pattern). ADDRESS is the
710 address to start the search. LENGTH specifies the scope of the
711 search from ADDRESS. PATTERN is the pattern to search for (and
712 must be a Python object supporting the buffer protocol).
713 Returns a Python Long object holding the address where the pattern
714 was located, or if the pattern was not found, returns None. Returns NULL
715 on error, with a python exception set. */
717 infpy_search_memory (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
719 struct gdb_exception except
= exception_none
;
720 CORE_ADDR start_addr
, length
;
721 static const char *keywords
[] = { "address", "length", "pattern", NULL
};
722 PyObject
*start_addr_obj
, *length_obj
;
723 Py_ssize_t pattern_size
;
724 const gdb_byte
*buffer
;
725 CORE_ADDR found_addr
;
730 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "OOs*", keywords
,
731 &start_addr_obj
, &length_obj
,
735 buffer
= (const gdb_byte
*) pybuf
.buf
;
736 pattern_size
= pybuf
.len
;
741 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "OOO", keywords
,
742 &start_addr_obj
, &length_obj
,
746 if (!PyObject_CheckReadBuffer (pattern
))
748 PyErr_SetString (PyExc_RuntimeError
,
749 _("The pattern is not a Python buffer."));
754 if (PyObject_AsReadBuffer (pattern
, &vbuffer
, &pattern_size
) == -1)
757 buffer
= (const gdb_byte
*) vbuffer
;
760 if (get_addr_from_python (start_addr_obj
, &start_addr
) < 0)
763 if (get_addr_from_python (length_obj
, &length
) < 0)
768 PyErr_SetString (PyExc_ValueError
,
769 _("Search range is empty."));
772 /* Watch for overflows. */
773 else if (length
> CORE_ADDR_MAX
774 || (start_addr
+ length
- 1) < start_addr
)
776 PyErr_SetString (PyExc_ValueError
,
777 _("The search range is too large."));
783 found
= target_search_memory (start_addr
, length
,
784 buffer
, pattern_size
,
787 CATCH (ex
, RETURN_MASK_ALL
)
794 PyBuffer_Release (&pybuf
);
796 GDB_PY_HANDLE_EXCEPTION (except
);
799 return PyLong_FromLong (found_addr
);
805 PyBuffer_Release (&pybuf
);
810 /* Implementation of gdb.Inferior.is_valid (self) -> Boolean.
811 Returns True if this inferior object still exists in GDB. */
814 infpy_is_valid (PyObject
*self
, PyObject
*args
)
816 inferior_object
*inf
= (inferior_object
*) self
;
825 infpy_dealloc (PyObject
*obj
)
827 inferior_object
*inf_obj
= (inferior_object
*) obj
;
828 struct inferior
*inf
= inf_obj
->inferior
;
833 set_inferior_data (inf
, infpy_inf_data_key
, NULL
);
836 /* Clear the INFERIOR pointer in an Inferior object and clear the
839 py_free_inferior (struct inferior
*inf
, void *datum
)
841 gdbpy_ref
<inferior_object
> inf_obj ((inferior_object
*) datum
);
842 struct threadlist_entry
*th_entry
, *th_tmp
;
844 if (!gdb_python_initialized
)
847 gdbpy_enter
enter_py (python_gdbarch
, python_language
);
849 inf_obj
->inferior
= NULL
;
851 /* Deallocate threads list. */
852 for (th_entry
= inf_obj
->threads
; th_entry
!= NULL
;)
854 Py_DECREF (th_entry
->thread_obj
);
857 th_entry
= th_entry
->next
;
861 inf_obj
->nthreads
= 0;
864 /* Implementation of gdb.selected_inferior() -> gdb.Inferior.
865 Returns the current inferior object. */
868 gdbpy_selected_inferior (PyObject
*self
, PyObject
*args
)
870 return inferior_to_inferior_object (current_inferior ());
874 gdbpy_initialize_inferior (void)
876 if (PyType_Ready (&inferior_object_type
) < 0)
879 if (gdb_pymodule_addobject (gdb_module
, "Inferior",
880 (PyObject
*) &inferior_object_type
) < 0)
884 register_inferior_data_with_cleanup (NULL
, py_free_inferior
);
886 observer_attach_new_thread (add_thread_object
);
887 observer_attach_thread_exit (delete_thread_object
);
888 observer_attach_normal_stop (python_on_normal_stop
);
889 observer_attach_target_resumed (python_on_resume
);
890 observer_attach_inferior_call_pre (python_on_inferior_call_pre
);
891 observer_attach_inferior_call_post (python_on_inferior_call_post
);
892 observer_attach_memory_changed (python_on_memory_change
);
893 observer_attach_register_changed (python_on_register_change
);
894 observer_attach_inferior_exit (python_inferior_exit
);
895 observer_attach_new_objfile (python_new_objfile
);
896 observer_attach_inferior_added (python_new_inferior
);
897 observer_attach_inferior_removed (python_inferior_deleted
);
899 membuf_object_type
.tp_new
= PyType_GenericNew
;
900 if (PyType_Ready (&membuf_object_type
) < 0)
903 return gdb_pymodule_addobject (gdb_module
, "Membuf", (PyObject
*)
904 &membuf_object_type
);
907 static gdb_PyGetSetDef inferior_object_getset
[] =
909 { "num", infpy_get_num
, NULL
, "ID of inferior, as assigned by GDB.", NULL
},
910 { "pid", infpy_get_pid
, NULL
, "PID of inferior, as assigned by the OS.",
912 { "was_attached", infpy_get_was_attached
, NULL
,
913 "True if the inferior was created using 'attach'.", NULL
},
917 static PyMethodDef inferior_object_methods
[] =
919 { "is_valid", infpy_is_valid
, METH_NOARGS
,
920 "is_valid () -> Boolean.\n\
921 Return true if this inferior is valid, false if not." },
922 { "threads", infpy_threads
, METH_NOARGS
,
923 "Return all the threads of this inferior." },
924 { "read_memory", (PyCFunction
) infpy_read_memory
,
925 METH_VARARGS
| METH_KEYWORDS
,
926 "read_memory (address, length) -> buffer\n\
927 Return a buffer object for reading from the inferior's memory." },
928 { "write_memory", (PyCFunction
) infpy_write_memory
,
929 METH_VARARGS
| METH_KEYWORDS
,
930 "write_memory (address, buffer [, length])\n\
931 Write the given buffer object to the inferior's memory." },
932 { "search_memory", (PyCFunction
) infpy_search_memory
,
933 METH_VARARGS
| METH_KEYWORDS
,
934 "search_memory (address, length, pattern) -> long\n\
935 Return a long with the address of a match, or None." },
939 PyTypeObject inferior_object_type
=
941 PyVarObject_HEAD_INIT (NULL
, 0)
942 "gdb.Inferior", /* tp_name */
943 sizeof (inferior_object
), /* tp_basicsize */
945 infpy_dealloc
, /* tp_dealloc */
951 0, /* tp_as_number */
952 0, /* tp_as_sequence */
953 0, /* tp_as_mapping */
959 0, /* tp_as_buffer */
960 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /* tp_flags */
961 "GDB inferior object", /* tp_doc */
964 0, /* tp_richcompare */
965 0, /* tp_weaklistoffset */
968 inferior_object_methods
, /* tp_methods */
970 inferior_object_getset
, /* tp_getset */
973 0, /* tp_descr_get */
974 0, /* tp_descr_set */
975 0, /* tp_dictoffset */
982 static PyBufferProcs buffer_procs
=
989 /* Python doesn't provide a decent way to get compatibility here. */
990 #if HAVE_LIBPYTHON2_4
991 #define CHARBUFFERPROC_NAME getcharbufferproc
993 #define CHARBUFFERPROC_NAME charbufferproc
996 static PyBufferProcs buffer_procs
= {
1000 /* The cast here works around a difference between Python 2.4 and
1002 (CHARBUFFERPROC_NAME
) get_char_buffer
1004 #endif /* IS_PY3K */
1006 PyTypeObject membuf_object_type
= {
1007 PyVarObject_HEAD_INIT (NULL
, 0)
1008 "gdb.Membuf", /*tp_name*/
1009 sizeof (membuf_object
), /*tp_basicsize*/
1011 mbpy_dealloc
, /*tp_dealloc*/
1018 0, /*tp_as_sequence*/
1019 0, /*tp_as_mapping*/
1022 mbpy_str
, /*tp_str*/
1025 &buffer_procs
, /*tp_as_buffer*/
1026 Py_TPFLAGS_DEFAULT
, /*tp_flags*/
1027 "GDB memory buffer object", /*tp_doc*/
1028 0, /* tp_traverse */
1030 0, /* tp_richcompare */
1031 0, /* tp_weaklistoffset */
1033 0, /* tp_iternext */
1039 0, /* tp_descr_get */
1040 0, /* tp_descr_set */
1041 0, /* tp_dictoffset */
1046 GDBPY_NEW_EVENT_TYPE (new_thread
,
1047 "gdb.NewThreadEvent",
1049 "GDB new thread event object",
1050 thread_event_object_type
);
1051 GDBPY_NEW_EVENT_TYPE (new_inferior
,
1052 "gdb.NewInferiorEvent",
1054 "GDB new inferior event object",
1056 GDBPY_NEW_EVENT_TYPE (inferior_deleted
,
1057 "gdb.InferiorDeletedEvent",
1058 "InferiorDeletedEvent",
1059 "GDB inferior deleted event object",