xref: /netbsd-src/external/gpl3/gdb/dist/gdb/python/py-inferior.c (revision 42b9e898991e23b560315a9b1da6a36a39d4351b)
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 };
1109