Home | History | Annotate | Line # | Download | only in python
py-inferior.c revision 1.8
      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