Add support for Python 3.
[binutils-gdb.git] / gdb / python / py-inferior.c
index 8acf87b187eca79648a4e5f3d825ecb5b938059a..670c935f565f40555cafff95863d8a207417b803 100644 (file)
@@ -454,9 +454,14 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw)
   membuf_obj->addr = addr;
   membuf_obj->length = length;
 
+#ifdef IS_PY3K
+  result = PyMemoryView_FromObject ((PyObject *) membuf_obj);
+#else
   result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0,
                                         Py_END_OF_BUFFER);
+#endif
   Py_DECREF (membuf_obj);
+
   return result;
 }
 
@@ -476,12 +481,22 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw)
   PyObject *addr_obj, *length_obj = NULL;
   volatile struct gdb_exception except;
   static char *keywords[] = { "address", "buffer", "length", NULL };
+#ifdef IS_PY3K
+  Py_buffer pybuf;
 
+  if (! PyArg_ParseTupleAndKeywords (args, kw, "Os*|O", keywords,
+                                    &addr_obj, &pybuf,
+                                    &length_obj))
+    return NULL;
 
+  buffer = pybuf.buf;
+  buf_len = pybuf.len;
+#else
   if (! PyArg_ParseTupleAndKeywords (args, kw, "Os#|O", keywords,
                                     &addr_obj, &buffer, &buf_len,
                                     &length_obj))
     return NULL;
+#endif
 
   TRY_CATCH (except, RETURN_MASK_ALL)
     {
@@ -500,8 +515,12 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw)
        }
       write_memory_with_notification (addr, buffer, length);
     }
+#ifdef IS_PY3K
+  PyBuffer_Release (&pybuf);
+#endif
   GDB_PY_HANDLE_EXCEPTION (except);
 
+
   if (error)
     return NULL;
 
@@ -513,7 +532,7 @@ static void
 mbpy_dealloc (PyObject *self)
 {
   xfree (((membuf_object *) self)->buffer);
-  self->ob_type->tp_free (self);
+  Py_TYPE (self)->tp_free (self);
 }
 
 /* Return a description of the Membuf object.  */
@@ -528,6 +547,24 @@ which is %s bytes long."),
                              pulongest (membuf_obj->length));
 }
 
+#ifdef IS_PY3K
+
+static int
+get_buffer (PyObject *self, Py_buffer *buf, int flags)
+{
+  membuf_object *membuf_obj = (membuf_object *) self;
+  int ret;
+  
+  ret = PyBuffer_FillInfo (buf, self, membuf_obj->buffer,
+                          membuf_obj->length, 0, 
+                          PyBUF_CONTIG);
+  buf->format = "c";
+
+  return ret;
+}
+
+#else
+
 static Py_ssize_t
 get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr)
 {
@@ -572,6 +609,8 @@ get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr)
   return ret;
 }
 
+#endif /* IS_PY3K */
+
 /* Implementation of
    gdb.search_memory (address, length, pattern).  ADDRESS is the
    address to start the search.  LENGTH specifies the scope of the
@@ -585,17 +624,41 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
 {
   CORE_ADDR start_addr, length;
   static char *keywords[] = { "address", "length", "pattern", NULL };
-  PyObject *pattern, *start_addr_obj, *length_obj;
+  PyObject *start_addr_obj, *length_obj;
   volatile struct gdb_exception except;
   Py_ssize_t pattern_size;
   const void *buffer;
   CORE_ADDR found_addr;
   int found = 0;
+#ifdef IS_PY3K
+  Py_buffer pybuf;
 
-  if (! PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords,
+  if (! PyArg_ParseTupleAndKeywords (args, kw, "OOs*", keywords,
                                     &start_addr_obj, &length_obj,
+                                    &pybuf))
+    return NULL;
+
+  buffer = pybuf.buf;
+  pattern_size = pybuf.len;
+#else
+  PyObject *pattern;
+  
+  if (! PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords,
+                                    &start_addr_obj, &length_obj,
                                     &pattern))
+     return NULL;
+
+  if (!PyObject_CheckReadBuffer (pattern))
+    {
+      PyErr_SetString (PyExc_RuntimeError,
+                      _("The pattern is not a Python buffer."));
+
+      return NULL;
+    }
+
+  if (PyObject_AsReadBuffer (pattern, &buffer, &pattern_size) == -1)
     return NULL;
+#endif
 
   if (get_addr_from_python (start_addr_obj, &start_addr)
       && get_addr_from_python (length_obj, &length))
@@ -604,6 +667,10 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
        {
          PyErr_SetString (PyExc_ValueError,
                           _("Search range is empty."));
+
+#ifdef IS_PY3K
+         PyBuffer_Release (&pybuf);
+#endif
          return NULL;
        }
       /* Watch for overflows.  */
@@ -613,23 +680,15 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
          PyErr_SetString (PyExc_ValueError,
                           _("The search range is too large."));
 
+#ifdef IS_PY3K
+         PyBuffer_Release (&pybuf);
+#endif
          return NULL;
        }
     }
   else
     return NULL;
 
-  if (!PyObject_CheckReadBuffer (pattern))
-    {
-      PyErr_SetString (PyExc_RuntimeError,
-                      _("The pattern is not a Python buffer."));
-
-      return NULL;
-    }
-
-  if (PyObject_AsReadBuffer (pattern, &buffer, &pattern_size) == -1)
-    return NULL;
-
   TRY_CATCH (except, RETURN_MASK_ALL)
     {
       found = target_search_memory (start_addr, length,
@@ -638,6 +697,10 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
     }
   GDB_PY_HANDLE_EXCEPTION (except);
 
+#ifdef IS_PY3K
+  PyBuffer_Release (&pybuf);
+#endif
+
   if (found)
     return PyLong_FromLong (found_addr);
   else
@@ -777,8 +840,7 @@ Return a long with the address of a match, or None." },
 
 static PyTypeObject inferior_object_type =
 {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /* ob_size */
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Inferior",                /* tp_name */
   sizeof (inferior_object),      /* tp_basicsize */
   0,                             /* tp_itemsize */
@@ -817,6 +879,15 @@ static PyTypeObject inferior_object_type =
   0                              /* tp_alloc */
 };
 
+#ifdef IS_PY3K
+
+static PyBufferProcs buffer_procs =
+{
+  get_buffer
+};
+
+#else
+
 /* Python doesn't provide a decent way to get compatibility here.  */
 #if HAVE_LIBPYTHON2_4
 #define CHARBUFFERPROC_NAME getcharbufferproc
@@ -832,10 +903,10 @@ static PyBufferProcs buffer_procs = {
      Python 2.5.  */
   (CHARBUFFERPROC_NAME) get_char_buffer
 };
+#endif /* IS_PY3K */
 
 static PyTypeObject membuf_object_type = {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Membuf",                          /*tp_name*/
   sizeof (membuf_object),        /*tp_basicsize*/
   0,                             /*tp_itemsize*/