]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/python/py-inferior.c
Normalize includes to use common/
[thirdparty/binutils-gdb.git] / gdb / python / py-inferior.c
1 /* Python interface to inferiors.
2
3 Copyright (C) 2009-2019 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20 #include "defs.h"
21 #include "gdbcore.h"
22 #include "gdbthread.h"
23 #include "inferior.h"
24 #include "objfiles.h"
25 #include "observable.h"
26 #include "python-internal.h"
27 #include "arch-utils.h"
28 #include "language.h"
29 #include "common/gdb_signals.h"
30 #include "py-event.h"
31 #include "py-stopevent.h"
32
33 struct threadlist_entry {
34 thread_object *thread_obj;
35 struct threadlist_entry *next;
36 };
37
38 struct inferior_object
39 {
40 PyObject_HEAD
41
42 /* The inferior we represent. */
43 struct inferior *inferior;
44
45 /* thread_object instances under this inferior. This list owns a
46 reference to each object it contains. */
47 struct threadlist_entry *threads;
48
49 /* Number of threads in the list. */
50 int nthreads;
51 };
52
53 extern PyTypeObject inferior_object_type
54 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object");
55
56 static const struct inferior_data *infpy_inf_data_key;
57
58 typedef struct {
59 PyObject_HEAD
60 void *buffer;
61
62 /* These are kept just for mbpy_str. */
63 CORE_ADDR addr;
64 CORE_ADDR length;
65 } membuf_object;
66
67 extern PyTypeObject membuf_object_type
68 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("membuf_object");
69
70 /* Require that INFERIOR be a valid inferior ID. */
71 #define INFPY_REQUIRE_VALID(Inferior) \
72 do { \
73 if (!Inferior->inferior) \
74 { \
75 PyErr_SetString (PyExc_RuntimeError, \
76 _("Inferior no longer exists.")); \
77 return NULL; \
78 } \
79 } while (0)
80
81 static void
82 python_on_normal_stop (struct bpstats *bs, int print_frame)
83 {
84 enum gdb_signal stop_signal;
85
86 if (!gdb_python_initialized)
87 return;
88
89 if (inferior_ptid == null_ptid)
90 return;
91
92 stop_signal = inferior_thread ()->suspend.stop_signal;
93
94 gdbpy_enter enter_py (get_current_arch (), current_language);
95
96 if (emit_stop_event (bs, stop_signal) < 0)
97 gdbpy_print_stack ();
98 }
99
100 static void
101 python_on_resume (ptid_t ptid)
102 {
103 if (!gdb_python_initialized)
104 return;
105
106 gdbpy_enter enter_py (target_gdbarch (), current_language);
107
108 if (emit_continue_event (ptid) < 0)
109 gdbpy_print_stack ();
110 }
111
112 /* Callback, registered as an observer, that notifies Python listeners
113 when an inferior function call is about to be made. */
114
115 static void
116 python_on_inferior_call_pre (ptid_t thread, CORE_ADDR address)
117 {
118 gdbpy_enter enter_py (target_gdbarch (), current_language);
119
120 if (emit_inferior_call_event (INFERIOR_CALL_PRE, thread, address) < 0)
121 gdbpy_print_stack ();
122 }
123
124 /* Callback, registered as an observer, that notifies Python listeners
125 when an inferior function call has completed. */
126
127 static void
128 python_on_inferior_call_post (ptid_t thread, CORE_ADDR address)
129 {
130 gdbpy_enter enter_py (target_gdbarch (), current_language);
131
132 if (emit_inferior_call_event (INFERIOR_CALL_POST, thread, address) < 0)
133 gdbpy_print_stack ();
134 }
135
136 /* Callback, registered as an observer, that notifies Python listeners
137 when a part of memory has been modified by user action (eg via a
138 'set' command). */
139
140 static void
141 python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len, const bfd_byte *data)
142 {
143 gdbpy_enter enter_py (target_gdbarch (), current_language);
144
145 if (emit_memory_changed_event (addr, len) < 0)
146 gdbpy_print_stack ();
147 }
148
149 /* Callback, registered as an observer, that notifies Python listeners
150 when a register has been modified by user action (eg via a 'set'
151 command). */
152
153 static void
154 python_on_register_change (struct frame_info *frame, int regnum)
155 {
156 gdbpy_enter enter_py (target_gdbarch (), current_language);
157
158 if (emit_register_changed_event (frame, regnum) < 0)
159 gdbpy_print_stack ();
160 }
161
162 static void
163 python_inferior_exit (struct inferior *inf)
164 {
165 const LONGEST *exit_code = NULL;
166
167 if (!gdb_python_initialized)
168 return;
169
170 gdbpy_enter enter_py (target_gdbarch (), current_language);
171
172 if (inf->has_exit_code)
173 exit_code = &inf->exit_code;
174
175 if (emit_exited_event (exit_code, inf) < 0)
176 gdbpy_print_stack ();
177 }
178
179 /* Callback used to notify Python listeners about new objfiles loaded in the
180 inferior. OBJFILE may be NULL which means that the objfile list has been
181 cleared (emptied). */
182
183 static void
184 python_new_objfile (struct objfile *objfile)
185 {
186 if (!gdb_python_initialized)
187 return;
188
189 gdbpy_enter enter_py (objfile != NULL
190 ? get_objfile_arch (objfile)
191 : target_gdbarch (),
192 current_language);
193
194 if (objfile == NULL)
195 {
196 if (emit_clear_objfiles_event () < 0)
197 gdbpy_print_stack ();
198 }
199 else
200 {
201 if (emit_new_objfile_event (objfile) < 0)
202 gdbpy_print_stack ();
203 }
204 }
205
206 /* Return a reference to the Python object of type Inferior
207 representing INFERIOR. If the object has already been created,
208 return it and increment the reference count, otherwise, create it.
209 Return NULL on failure. */
210
211 gdbpy_ref<inferior_object>
212 inferior_to_inferior_object (struct inferior *inferior)
213 {
214 inferior_object *inf_obj;
215
216 inf_obj = (inferior_object *) inferior_data (inferior, infpy_inf_data_key);
217 if (!inf_obj)
218 {
219 inf_obj = PyObject_New (inferior_object, &inferior_object_type);
220 if (!inf_obj)
221 return NULL;
222
223 inf_obj->inferior = inferior;
224 inf_obj->threads = NULL;
225 inf_obj->nthreads = 0;
226
227 /* PyObject_New initializes the new object with a refcount of 1. This
228 counts for the reference we are keeping in the inferior data. */
229 set_inferior_data (inferior, infpy_inf_data_key, inf_obj);
230 }
231
232 /* We are returning a new reference. */
233 gdb_assert (inf_obj != nullptr);
234 return gdbpy_ref<inferior_object>::new_reference (inf_obj);
235 }
236
237 /* Called when a new inferior is created. Notifies any Python event
238 listeners. */
239 static void
240 python_new_inferior (struct inferior *inf)
241 {
242 if (!gdb_python_initialized)
243 return;
244
245 gdbpy_enter enter_py (python_gdbarch, python_language);
246
247 if (evregpy_no_listeners_p (gdb_py_events.new_inferior))
248 return;
249
250 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
251 if (inf_obj == NULL)
252 {
253 gdbpy_print_stack ();
254 return;
255 }
256
257 gdbpy_ref<> event = create_event_object (&new_inferior_event_object_type);
258 if (event == NULL
259 || evpy_add_attribute (event.get (), "inferior",
260 (PyObject *) inf_obj.get ()) < 0
261 || evpy_emit_event (event.get (), gdb_py_events.new_inferior) < 0)
262 gdbpy_print_stack ();
263 }
264
265 /* Called when an inferior is removed. Notifies any Python event
266 listeners. */
267 static void
268 python_inferior_deleted (struct inferior *inf)
269 {
270 if (!gdb_python_initialized)
271 return;
272
273 gdbpy_enter enter_py (python_gdbarch, python_language);
274
275 if (evregpy_no_listeners_p (gdb_py_events.inferior_deleted))
276 return;
277
278 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
279 if (inf_obj == NULL)
280 {
281 gdbpy_print_stack ();
282 return;
283 }
284
285 gdbpy_ref<> event = create_event_object (&inferior_deleted_event_object_type);
286 if (event == NULL
287 || evpy_add_attribute (event.get (), "inferior",
288 (PyObject *) inf_obj.get ()) < 0
289 || evpy_emit_event (event.get (), gdb_py_events.inferior_deleted) < 0)
290 gdbpy_print_stack ();
291 }
292
293 gdbpy_ref<>
294 thread_to_thread_object (thread_info *thr)
295 {
296 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (thr->inf);
297 if (inf_obj == NULL)
298 return NULL;
299
300 for (threadlist_entry *thread = inf_obj->threads;
301 thread != NULL;
302 thread = thread->next)
303 if (thread->thread_obj->thread == thr)
304 return gdbpy_ref<>::new_reference ((PyObject *) thread->thread_obj);
305
306 PyErr_SetString (PyExc_SystemError,
307 _("could not find gdb thread object"));
308 return NULL;
309 }
310
311 static void
312 add_thread_object (struct thread_info *tp)
313 {
314 thread_object *thread_obj;
315 inferior_object *inf_obj;
316 struct threadlist_entry *entry;
317
318 if (!gdb_python_initialized)
319 return;
320
321 gdbpy_enter enter_py (python_gdbarch, python_language);
322
323 thread_obj = create_thread_object (tp);
324 if (!thread_obj)
325 {
326 gdbpy_print_stack ();
327 return;
328 }
329
330 inf_obj = (inferior_object *) thread_obj->inf_obj;
331
332 entry = XNEW (struct threadlist_entry);
333 entry->thread_obj = thread_obj;
334 entry->next = inf_obj->threads;
335
336 inf_obj->threads = entry;
337 inf_obj->nthreads++;
338
339 if (evregpy_no_listeners_p (gdb_py_events.new_thread))
340 return;
341
342 gdbpy_ref<> event = create_thread_event_object (&new_thread_event_object_type,
343 (PyObject *) thread_obj);
344 if (event == NULL
345 || evpy_emit_event (event.get (), gdb_py_events.new_thread) < 0)
346 gdbpy_print_stack ();
347 }
348
349 static void
350 delete_thread_object (struct thread_info *tp, int ignore)
351 {
352 struct threadlist_entry **entry, *tmp;
353
354 if (!gdb_python_initialized)
355 return;
356
357 gdbpy_enter enter_py (python_gdbarch, python_language);
358
359 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (tp->inf);
360 if (inf_obj == NULL)
361 return;
362
363 /* Find thread entry in its inferior's thread_list. */
364 for (entry = &inf_obj->threads; *entry != NULL; entry =
365 &(*entry)->next)
366 if ((*entry)->thread_obj->thread == tp)
367 break;
368
369 if (!*entry)
370 return;
371
372 tmp = *entry;
373 tmp->thread_obj->thread = NULL;
374
375 *entry = (*entry)->next;
376 inf_obj->nthreads--;
377
378 Py_DECREF (tmp->thread_obj);
379 xfree (tmp);
380 }
381
382 static PyObject *
383 infpy_threads (PyObject *self, PyObject *args)
384 {
385 int i;
386 struct threadlist_entry *entry;
387 inferior_object *inf_obj = (inferior_object *) self;
388 PyObject *tuple;
389
390 INFPY_REQUIRE_VALID (inf_obj);
391
392 TRY
393 {
394 update_thread_list ();
395 }
396 CATCH (except, RETURN_MASK_ALL)
397 {
398 GDB_PY_HANDLE_EXCEPTION (except);
399 }
400 END_CATCH
401
402 tuple = PyTuple_New (inf_obj->nthreads);
403 if (!tuple)
404 return NULL;
405
406 for (i = 0, entry = inf_obj->threads; i < inf_obj->nthreads;
407 i++, entry = entry->next)
408 {
409 Py_INCREF (entry->thread_obj);
410 PyTuple_SET_ITEM (tuple, i, (PyObject *) entry->thread_obj);
411 }
412
413 return tuple;
414 }
415
416 static PyObject *
417 infpy_get_num (PyObject *self, void *closure)
418 {
419 inferior_object *inf = (inferior_object *) self;
420
421 INFPY_REQUIRE_VALID (inf);
422
423 return PyLong_FromLong (inf->inferior->num);
424 }
425
426 static PyObject *
427 infpy_get_pid (PyObject *self, void *closure)
428 {
429 inferior_object *inf = (inferior_object *) self;
430
431 INFPY_REQUIRE_VALID (inf);
432
433 return PyLong_FromLong (inf->inferior->pid);
434 }
435
436 static PyObject *
437 infpy_get_was_attached (PyObject *self, void *closure)
438 {
439 inferior_object *inf = (inferior_object *) self;
440
441 INFPY_REQUIRE_VALID (inf);
442 if (inf->inferior->attach_flag)
443 Py_RETURN_TRUE;
444 Py_RETURN_FALSE;
445 }
446
447 /* Getter of gdb.Inferior.progspace. */
448
449 static PyObject *
450 infpy_get_progspace (PyObject *self, void *closure)
451 {
452 inferior_object *inf = (inferior_object *) self;
453
454 INFPY_REQUIRE_VALID (inf);
455
456 program_space *pspace = inf->inferior->pspace;
457 gdb_assert (pspace != nullptr);
458
459 return pspace_to_pspace_object (pspace).release ();
460 }
461
462 static int
463 build_inferior_list (struct inferior *inf, void *arg)
464 {
465 PyObject *list = (PyObject *) arg;
466 gdbpy_ref<inferior_object> inferior = inferior_to_inferior_object (inf);
467
468 if (inferior == NULL)
469 return 0;
470
471 return PyList_Append (list, (PyObject *) inferior.get ()) ? 1 : 0;
472 }
473
474 /* Implementation of gdb.inferiors () -> (gdb.Inferior, ...).
475 Returns a tuple of all inferiors. */
476 PyObject *
477 gdbpy_inferiors (PyObject *unused, PyObject *unused2)
478 {
479 gdbpy_ref<> list (PyList_New (0));
480 if (list == NULL)
481 return NULL;
482
483 if (iterate_over_inferiors (build_inferior_list, list.get ()))
484 return NULL;
485
486 return PyList_AsTuple (list.get ());
487 }
488
489 /* Membuf and memory manipulation. */
490
491 /* Implementation of Inferior.read_memory (address, length).
492 Returns a Python buffer object with LENGTH bytes of the inferior's
493 memory at ADDRESS. Both arguments are integers. Returns NULL on error,
494 with a python exception set. */
495 static PyObject *
496 infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw)
497 {
498 CORE_ADDR addr, length;
499 gdb::unique_xmalloc_ptr<gdb_byte> buffer;
500 PyObject *addr_obj, *length_obj, *result;
501 static const char *keywords[] = { "address", "length", NULL };
502
503 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OO", keywords,
504 &addr_obj, &length_obj))
505 return NULL;
506
507 if (get_addr_from_python (addr_obj, &addr) < 0
508 || get_addr_from_python (length_obj, &length) < 0)
509 return NULL;
510
511 TRY
512 {
513 buffer.reset ((gdb_byte *) xmalloc (length));
514
515 read_memory (addr, buffer.get (), length);
516 }
517 CATCH (except, RETURN_MASK_ALL)
518 {
519 GDB_PY_HANDLE_EXCEPTION (except);
520 }
521 END_CATCH
522
523 gdbpy_ref<membuf_object> membuf_obj (PyObject_New (membuf_object,
524 &membuf_object_type));
525 if (membuf_obj == NULL)
526 return NULL;
527
528 membuf_obj->buffer = buffer.release ();
529 membuf_obj->addr = addr;
530 membuf_obj->length = length;
531
532 #ifdef IS_PY3K
533 result = PyMemoryView_FromObject ((PyObject *) membuf_obj.get ());
534 #else
535 result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj.get (), 0,
536 Py_END_OF_BUFFER);
537 #endif
538
539 return result;
540 }
541
542 /* Implementation of Inferior.write_memory (address, buffer [, length]).
543 Writes the contents of BUFFER (a Python object supporting the read
544 buffer protocol) at ADDRESS in the inferior's memory. Write LENGTH
545 bytes from BUFFER, or its entire contents if the argument is not
546 provided. The function returns nothing. Returns NULL on error, with
547 a python exception set. */
548 static PyObject *
549 infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw)
550 {
551 struct gdb_exception except = exception_none;
552 Py_ssize_t buf_len;
553 const gdb_byte *buffer;
554 CORE_ADDR addr, length;
555 PyObject *addr_obj, *length_obj = NULL;
556 static const char *keywords[] = { "address", "buffer", "length", NULL };
557 #ifdef IS_PY3K
558 Py_buffer pybuf;
559
560 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "Os*|O", keywords,
561 &addr_obj, &pybuf, &length_obj))
562 return NULL;
563
564 buffer = (const gdb_byte *) pybuf.buf;
565 buf_len = pybuf.len;
566 #else
567 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "Os#|O", keywords,
568 &addr_obj, &buffer, &buf_len,
569 &length_obj))
570 return NULL;
571
572 buffer = (const gdb_byte *) buffer;
573 #endif
574
575 if (get_addr_from_python (addr_obj, &addr) < 0)
576 goto fail;
577
578 if (!length_obj)
579 length = buf_len;
580 else if (get_addr_from_python (length_obj, &length) < 0)
581 goto fail;
582
583 TRY
584 {
585 write_memory_with_notification (addr, buffer, length);
586 }
587 CATCH (ex, RETURN_MASK_ALL)
588 {
589 except = ex;
590 }
591 END_CATCH
592
593 #ifdef IS_PY3K
594 PyBuffer_Release (&pybuf);
595 #endif
596 GDB_PY_HANDLE_EXCEPTION (except);
597
598 Py_RETURN_NONE;
599
600 fail:
601 #ifdef IS_PY3K
602 PyBuffer_Release (&pybuf);
603 #endif
604 return NULL;
605 }
606
607 /* Destructor of Membuf objects. */
608 static void
609 mbpy_dealloc (PyObject *self)
610 {
611 xfree (((membuf_object *) self)->buffer);
612 Py_TYPE (self)->tp_free (self);
613 }
614
615 /* Return a description of the Membuf object. */
616 static PyObject *
617 mbpy_str (PyObject *self)
618 {
619 membuf_object *membuf_obj = (membuf_object *) self;
620
621 return PyString_FromFormat (_("Memory buffer for address %s, \
622 which is %s bytes long."),
623 paddress (python_gdbarch, membuf_obj->addr),
624 pulongest (membuf_obj->length));
625 }
626
627 #ifdef IS_PY3K
628
629 static int
630 get_buffer (PyObject *self, Py_buffer *buf, int flags)
631 {
632 membuf_object *membuf_obj = (membuf_object *) self;
633 int ret;
634
635 ret = PyBuffer_FillInfo (buf, self, membuf_obj->buffer,
636 membuf_obj->length, 0,
637 PyBUF_CONTIG);
638
639 /* Despite the documentation saying this field is a "const char *",
640 in Python 3.4 at least, it's really a "char *". */
641 buf->format = (char *) "c";
642
643 return ret;
644 }
645
646 #else
647
648 static Py_ssize_t
649 get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr)
650 {
651 membuf_object *membuf_obj = (membuf_object *) self;
652
653 if (segment)
654 {
655 PyErr_SetString (PyExc_SystemError,
656 _("The memory buffer supports only one segment."));
657 return -1;
658 }
659
660 *ptrptr = membuf_obj->buffer;
661
662 return membuf_obj->length;
663 }
664
665 static Py_ssize_t
666 get_write_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr)
667 {
668 return get_read_buffer (self, segment, ptrptr);
669 }
670
671 static Py_ssize_t
672 get_seg_count (PyObject *self, Py_ssize_t *lenp)
673 {
674 if (lenp)
675 *lenp = ((membuf_object *) self)->length;
676
677 return 1;
678 }
679
680 static Py_ssize_t
681 get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr)
682 {
683 void *ptr = NULL;
684 Py_ssize_t ret;
685
686 ret = get_read_buffer (self, segment, &ptr);
687 *ptrptr = (char *) ptr;
688
689 return ret;
690 }
691
692 #endif /* IS_PY3K */
693
694 /* Implementation of
695 gdb.search_memory (address, length, pattern). ADDRESS is the
696 address to start the search. LENGTH specifies the scope of the
697 search from ADDRESS. PATTERN is the pattern to search for (and
698 must be a Python object supporting the buffer protocol).
699 Returns a Python Long object holding the address where the pattern
700 was located, or if the pattern was not found, returns None. Returns NULL
701 on error, with a python exception set. */
702 static PyObject *
703 infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
704 {
705 struct gdb_exception except = exception_none;
706 CORE_ADDR start_addr, length;
707 static const char *keywords[] = { "address", "length", "pattern", NULL };
708 PyObject *start_addr_obj, *length_obj;
709 Py_ssize_t pattern_size;
710 const gdb_byte *buffer;
711 CORE_ADDR found_addr;
712 int found = 0;
713 #ifdef IS_PY3K
714 Py_buffer pybuf;
715
716 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OOs*", keywords,
717 &start_addr_obj, &length_obj,
718 &pybuf))
719 return NULL;
720
721 buffer = (const gdb_byte *) pybuf.buf;
722 pattern_size = pybuf.len;
723 #else
724 PyObject *pattern;
725 const void *vbuffer;
726
727 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords,
728 &start_addr_obj, &length_obj,
729 &pattern))
730 return NULL;
731
732 if (!PyObject_CheckReadBuffer (pattern))
733 {
734 PyErr_SetString (PyExc_RuntimeError,
735 _("The pattern is not a Python buffer."));
736
737 return NULL;
738 }
739
740 if (PyObject_AsReadBuffer (pattern, &vbuffer, &pattern_size) == -1)
741 return NULL;
742
743 buffer = (const gdb_byte *) vbuffer;
744 #endif
745
746 if (get_addr_from_python (start_addr_obj, &start_addr) < 0)
747 goto fail;
748
749 if (get_addr_from_python (length_obj, &length) < 0)
750 goto fail;
751
752 if (!length)
753 {
754 PyErr_SetString (PyExc_ValueError,
755 _("Search range is empty."));
756 goto fail;
757 }
758 /* Watch for overflows. */
759 else if (length > CORE_ADDR_MAX
760 || (start_addr + length - 1) < start_addr)
761 {
762 PyErr_SetString (PyExc_ValueError,
763 _("The search range is too large."));
764 goto fail;
765 }
766
767 TRY
768 {
769 found = target_search_memory (start_addr, length,
770 buffer, pattern_size,
771 &found_addr);
772 }
773 CATCH (ex, RETURN_MASK_ALL)
774 {
775 except = ex;
776 }
777 END_CATCH
778
779 #ifdef IS_PY3K
780 PyBuffer_Release (&pybuf);
781 #endif
782 GDB_PY_HANDLE_EXCEPTION (except);
783
784 if (found)
785 return PyLong_FromLong (found_addr);
786 else
787 Py_RETURN_NONE;
788
789 fail:
790 #ifdef IS_PY3K
791 PyBuffer_Release (&pybuf);
792 #endif
793 return NULL;
794 }
795
796 /* Implementation of gdb.Inferior.is_valid (self) -> Boolean.
797 Returns True if this inferior object still exists in GDB. */
798
799 static PyObject *
800 infpy_is_valid (PyObject *self, PyObject *args)
801 {
802 inferior_object *inf = (inferior_object *) self;
803
804 if (! inf->inferior)
805 Py_RETURN_FALSE;
806
807 Py_RETURN_TRUE;
808 }
809
810 /* Implementation of gdb.Inferior.thread_from_thread_handle (self, handle)
811 -> gdb.InferiorThread. */
812
813 static PyObject *
814 infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw)
815 {
816 PyObject *handle_obj;
817 inferior_object *inf_obj = (inferior_object *) self;
818 static const char *keywords[] = { "thread_handle", NULL };
819
820 INFPY_REQUIRE_VALID (inf_obj);
821
822 if (! gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords, &handle_obj))
823 return NULL;
824
825 if (!gdbpy_is_value_object (handle_obj))
826 {
827 PyErr_SetString (PyExc_TypeError,
828 _("Argument 'handle_obj' must be a thread handle object."));
829
830 return NULL;
831 }
832
833 TRY
834 {
835 struct thread_info *thread_info;
836 struct value *val = value_object_to_value (handle_obj);
837
838 thread_info = find_thread_by_handle (val, inf_obj->inferior);
839 if (thread_info != NULL)
840 return thread_to_thread_object (thread_info).release ();
841 }
842 CATCH (except, RETURN_MASK_ALL)
843 {
844 GDB_PY_HANDLE_EXCEPTION (except);
845 }
846 END_CATCH
847
848 Py_RETURN_NONE;
849 }
850
851 /* Implementation of gdb.Inferior.architecture. */
852
853 static PyObject *
854 infpy_architecture (PyObject *self, PyObject *args)
855 {
856 inferior_object *inf = (inferior_object *) self;
857
858 INFPY_REQUIRE_VALID (inf);
859
860 return gdbarch_to_arch_object (inf->inferior->gdbarch);
861 }
862
863 /* Implement repr() for gdb.Inferior. */
864
865 static PyObject *
866 infpy_repr (PyObject *obj)
867 {
868 inferior_object *self = (inferior_object *) obj;
869 inferior *inf = self->inferior;
870
871 if (inf == nullptr)
872 return PyString_FromString ("<gdb.Inferior (invalid)>");
873
874 return PyString_FromFormat ("<gdb.Inferior num=%d, pid=%d>",
875 inf->num, inf->pid);
876 }
877
878
879 static void
880 infpy_dealloc (PyObject *obj)
881 {
882 inferior_object *inf_obj = (inferior_object *) obj;
883 struct inferior *inf = inf_obj->inferior;
884
885 if (! inf)
886 return;
887
888 set_inferior_data (inf, infpy_inf_data_key, NULL);
889 }
890
891 /* Clear the INFERIOR pointer in an Inferior object and clear the
892 thread list. */
893 static void
894 py_free_inferior (struct inferior *inf, void *datum)
895 {
896 gdbpy_ref<inferior_object> inf_obj ((inferior_object *) datum);
897 struct threadlist_entry *th_entry, *th_tmp;
898
899 if (!gdb_python_initialized)
900 return;
901
902 gdbpy_enter enter_py (python_gdbarch, python_language);
903
904 inf_obj->inferior = NULL;
905
906 /* Deallocate threads list. */
907 for (th_entry = inf_obj->threads; th_entry != NULL;)
908 {
909 Py_DECREF (th_entry->thread_obj);
910
911 th_tmp = th_entry;
912 th_entry = th_entry->next;
913 xfree (th_tmp);
914 }
915
916 inf_obj->nthreads = 0;
917 }
918
919 /* Implementation of gdb.selected_inferior() -> gdb.Inferior.
920 Returns the current inferior object. */
921
922 PyObject *
923 gdbpy_selected_inferior (PyObject *self, PyObject *args)
924 {
925 return ((PyObject *)
926 inferior_to_inferior_object (current_inferior ()).release ());
927 }
928
929 int
930 gdbpy_initialize_inferior (void)
931 {
932 if (PyType_Ready (&inferior_object_type) < 0)
933 return -1;
934
935 if (gdb_pymodule_addobject (gdb_module, "Inferior",
936 (PyObject *) &inferior_object_type) < 0)
937 return -1;
938
939 infpy_inf_data_key =
940 register_inferior_data_with_cleanup (NULL, py_free_inferior);
941
942 gdb::observers::new_thread.attach (add_thread_object);
943 gdb::observers::thread_exit.attach (delete_thread_object);
944 gdb::observers::normal_stop.attach (python_on_normal_stop);
945 gdb::observers::target_resumed.attach (python_on_resume);
946 gdb::observers::inferior_call_pre.attach (python_on_inferior_call_pre);
947 gdb::observers::inferior_call_post.attach (python_on_inferior_call_post);
948 gdb::observers::memory_changed.attach (python_on_memory_change);
949 gdb::observers::register_changed.attach (python_on_register_change);
950 gdb::observers::inferior_exit.attach (python_inferior_exit);
951 gdb::observers::new_objfile.attach (python_new_objfile);
952 gdb::observers::inferior_added.attach (python_new_inferior);
953 gdb::observers::inferior_removed.attach (python_inferior_deleted);
954
955 membuf_object_type.tp_new = PyType_GenericNew;
956 if (PyType_Ready (&membuf_object_type) < 0)
957 return -1;
958
959 return gdb_pymodule_addobject (gdb_module, "Membuf",
960 (PyObject *) &membuf_object_type);
961 }
962
963 static gdb_PyGetSetDef inferior_object_getset[] =
964 {
965 { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL },
966 { "pid", infpy_get_pid, NULL, "PID of inferior, as assigned by the OS.",
967 NULL },
968 { "was_attached", infpy_get_was_attached, NULL,
969 "True if the inferior was created using 'attach'.", NULL },
970 { "progspace", infpy_get_progspace, NULL, "Program space of this inferior" },
971 { NULL }
972 };
973
974 static PyMethodDef inferior_object_methods[] =
975 {
976 { "is_valid", infpy_is_valid, METH_NOARGS,
977 "is_valid () -> Boolean.\n\
978 Return true if this inferior is valid, false if not." },
979 { "threads", infpy_threads, METH_NOARGS,
980 "Return all the threads of this inferior." },
981 { "read_memory", (PyCFunction) infpy_read_memory,
982 METH_VARARGS | METH_KEYWORDS,
983 "read_memory (address, length) -> buffer\n\
984 Return a buffer object for reading from the inferior's memory." },
985 { "write_memory", (PyCFunction) infpy_write_memory,
986 METH_VARARGS | METH_KEYWORDS,
987 "write_memory (address, buffer [, length])\n\
988 Write the given buffer object to the inferior's memory." },
989 { "search_memory", (PyCFunction) infpy_search_memory,
990 METH_VARARGS | METH_KEYWORDS,
991 "search_memory (address, length, pattern) -> long\n\
992 Return a long with the address of a match, or None." },
993 { "thread_from_thread_handle", (PyCFunction) infpy_thread_from_thread_handle,
994 METH_VARARGS | METH_KEYWORDS,
995 "thread_from_thread_handle (handle) -> gdb.InferiorThread.\n\
996 Return thread object corresponding to thread handle." },
997 { "architecture", (PyCFunction) infpy_architecture, METH_NOARGS,
998 "architecture () -> gdb.Architecture\n\
999 Return architecture of this inferior." },
1000 { NULL }
1001 };
1002
1003 PyTypeObject inferior_object_type =
1004 {
1005 PyVarObject_HEAD_INIT (NULL, 0)
1006 "gdb.Inferior", /* tp_name */
1007 sizeof (inferior_object), /* tp_basicsize */
1008 0, /* tp_itemsize */
1009 infpy_dealloc, /* tp_dealloc */
1010 0, /* tp_print */
1011 0, /* tp_getattr */
1012 0, /* tp_setattr */
1013 0, /* tp_compare */
1014 infpy_repr, /* tp_repr */
1015 0, /* tp_as_number */
1016 0, /* tp_as_sequence */
1017 0, /* tp_as_mapping */
1018 0, /* tp_hash */
1019 0, /* tp_call */
1020 0, /* tp_str */
1021 0, /* tp_getattro */
1022 0, /* tp_setattro */
1023 0, /* tp_as_buffer */
1024 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */
1025 "GDB inferior object", /* tp_doc */
1026 0, /* tp_traverse */
1027 0, /* tp_clear */
1028 0, /* tp_richcompare */
1029 0, /* tp_weaklistoffset */
1030 0, /* tp_iter */
1031 0, /* tp_iternext */
1032 inferior_object_methods, /* tp_methods */
1033 0, /* tp_members */
1034 inferior_object_getset, /* tp_getset */
1035 0, /* tp_base */
1036 0, /* tp_dict */
1037 0, /* tp_descr_get */
1038 0, /* tp_descr_set */
1039 0, /* tp_dictoffset */
1040 0, /* tp_init */
1041 0 /* tp_alloc */
1042 };
1043
1044 #ifdef IS_PY3K
1045
1046 static PyBufferProcs buffer_procs =
1047 {
1048 get_buffer
1049 };
1050
1051 #else
1052
1053 /* Python doesn't provide a decent way to get compatibility here. */
1054 #if HAVE_LIBPYTHON2_4
1055 #define CHARBUFFERPROC_NAME getcharbufferproc
1056 #else
1057 #define CHARBUFFERPROC_NAME charbufferproc
1058 #endif
1059
1060 static PyBufferProcs buffer_procs = {
1061 get_read_buffer,
1062 get_write_buffer,
1063 get_seg_count,
1064 /* The cast here works around a difference between Python 2.4 and
1065 Python 2.5. */
1066 (CHARBUFFERPROC_NAME) get_char_buffer
1067 };
1068 #endif /* IS_PY3K */
1069
1070 PyTypeObject membuf_object_type = {
1071 PyVarObject_HEAD_INIT (NULL, 0)
1072 "gdb.Membuf", /*tp_name*/
1073 sizeof (membuf_object), /*tp_basicsize*/
1074 0, /*tp_itemsize*/
1075 mbpy_dealloc, /*tp_dealloc*/
1076 0, /*tp_print*/
1077 0, /*tp_getattr*/
1078 0, /*tp_setattr*/
1079 0, /*tp_compare*/
1080 0, /*tp_repr*/
1081 0, /*tp_as_number*/
1082 0, /*tp_as_sequence*/
1083 0, /*tp_as_mapping*/
1084 0, /*tp_hash */
1085 0, /*tp_call*/
1086 mbpy_str, /*tp_str*/
1087 0, /*tp_getattro*/
1088 0, /*tp_setattro*/
1089 &buffer_procs, /*tp_as_buffer*/
1090 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1091 "GDB memory buffer object", /*tp_doc*/
1092 0, /* tp_traverse */
1093 0, /* tp_clear */
1094 0, /* tp_richcompare */
1095 0, /* tp_weaklistoffset */
1096 0, /* tp_iter */
1097 0, /* tp_iternext */
1098 0, /* tp_methods */
1099 0, /* tp_members */
1100 0, /* tp_getset */
1101 0, /* tp_base */
1102 0, /* tp_dict */
1103 0, /* tp_descr_get */
1104 0, /* tp_descr_set */
1105 0, /* tp_dictoffset */
1106 0, /* tp_init */
1107 0, /* tp_alloc */
1108 };