Author: Ronan Lamy <[email protected]>
Branch: fix-cpyext-releasebuffer
Changeset: r90472:99ed56433685
Date: 2017-03-02 11:07 +0100
http://bitbucket.org/pypy/pypy/changeset/99ed56433685/
Log: Add new buffer to array.c and test that bf_releasebuffer is called
(failing)
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -468,11 +468,12 @@
ptr = pybuf.c_buf
size = pybuf.c_len
ndim = widen(pybuf.c_ndim)
- shape = [pybuf.c_shape[i] for i in range(ndim)]
+ shape = None
+ if pybuf.c_shape:
+ shape = [pybuf.c_shape[i] for i in range(ndim)]
+ strides = None
if pybuf.c_strides:
strides = [pybuf.c_strides[i] for i in range(ndim)]
- else:
- strides = [1]
if pybuf.c_format:
format = rffi.charp2str(pybuf.c_format)
else:
diff --git a/pypy/module/cpyext/test/array.c b/pypy/module/cpyext/test/array.c
--- a/pypy/module/cpyext/test/array.c
+++ b/pypy/module/cpyext/test/array.c
@@ -1893,10 +1893,10 @@
}
else if(obj1->ob_type == &Arraytype)
fprintf(stderr, "\nCannot multiply array of type %c and %s\n",
- ((arrayobject*)obj1)->ob_descr->typecode, obj2->ob_type->tp_name);
+ ((arrayobject*)obj1)->ob_descr->typecode, obj2->ob_type->tp_name);
else if(obj2->ob_type == &Arraytype)
fprintf(stderr, "\nCannot multiply array of type %c and %s\n",
- ((arrayobject*)obj2)->ob_descr->typecode, obj1->ob_type->tp_name);
+ ((arrayobject*)obj2)->ob_descr->typecode, obj1->ob_type->tp_name);
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
@@ -1947,10 +1947,10 @@
}
else if(obj1->ob_type == &Arraytype)
fprintf(stderr, "\nCannot multiply array of type %c and %s\n",
- ((arrayobject*)obj1)->ob_descr->typecode, obj2->ob_type->tp_name);
+ ((arrayobject*)obj1)->ob_descr->typecode, obj2->ob_type->tp_name);
else if(obj2->ob_type == &Arraytype)
fprintf(stderr, "\nCannot multiply array of type %c and %s\n",
- ((arrayobject*)obj2)->ob_descr->typecode, obj1->ob_type->tp_name);
+ ((arrayobject*)obj2)->ob_descr->typecode, obj1->ob_type->tp_name);
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
@@ -2006,6 +2006,29 @@
return 1;
}
+static int
+array_getbuffer(PyObject* obj, Py_buffer* view, int flags)
+{
+ arrayobject* self = (arrayobject*)obj;
+ return PyBuffer_FillInfo(view, obj, self->ob_item,
+ Py_SIZE(self)*self->ob_descr->itemsize, 0, flags);
+}
+
+static long releasebuffer_cnt = 0;
+
+static PyObject *
+get_releasebuffer_cnt(void)
+{
+ return PyLong_FromLong(releasebuffer_cnt);
+}
+
+static void
+array_releasebuffer(arrayobject* self)
+{
+ releasebuffer_cnt++;
+ return;
+}
+
static PySequenceMethods array_as_sequence = {
(lenfunc)array_length, /*sq_length*/
(binaryfunc)array_concat, /*sq_concat*/
@@ -2024,6 +2047,8 @@
(writebufferproc)array_buffer_getwritebuf,
(segcountproc)array_buffer_getsegcount,
NULL,
+ (getbufferproc)array_getbuffer,
+ (releasebufferproc)array_releasebuffer
};
static PyObject *
@@ -2237,7 +2262,7 @@
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
&array_as_buffer, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_HAVE_WEAKREFS | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
arraytype_doc, /* tp_doc */
0, /* tp_traverse */
@@ -2280,8 +2305,9 @@
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
&array_as_buffer, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
- Py_TPFLAGS_HAVE_WEAKREFS | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_HAVE_WEAKREFS | Py_TPFLAGS_CHECKTYPES |
+ Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */
arraytype_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -2409,6 +2435,16 @@
return PyString_FromStringAndSize((char*)ptr, size);
}
+static PyObject *
+create_and_release_buffer(PyObject *self, PyObject *obj)
+{
+ Py_buffer view;
+ int res = PyObject_GetBuffer(obj, &view, 0);
+ if (res < 0)
+ return NULL;
+ PyBuffer_Release(&view);
+ Py_RETURN_NONE;
+}
/*********************** Install Module **************************/
@@ -2417,6 +2453,8 @@
{"_reconstruct", (PyCFunction)_reconstruct, METH_VARARGS, NULL},
{"switch_multiply", (PyCFunction)switch_multiply, METH_NOARGS, NULL},
{"readbuffer_as_string", (PyCFunction)readbuffer_as_string,
METH_VARARGS, NULL},
+ {"get_releasebuffer_cnt", (PyCFunction)get_releasebuffer_cnt,
METH_NOARGS, NULL},
+ {"create_and_release_buffer", (PyCFunction)create_and_release_buffer,
METH_O, NULL},
{NULL, NULL, 0, NULL} /* Sentinel */
};
diff --git a/pypy/module/cpyext/test/test_arraymodule.py
b/pypy/module/cpyext/test/test_arraymodule.py
--- a/pypy/module/cpyext/test/test_arraymodule.py
+++ b/pypy/module/cpyext/test/test_arraymodule.py
@@ -78,6 +78,23 @@
'\x03\0\0\0'
'\x04\0\0\0')
+ def test_releasebuffer(self):
+ module = self.import_module(name='array')
+ arr = module.array('i', [1,2,3,4])
+ assert module.get_releasebuffer_cnt() == 0
+ module.create_and_release_buffer(arr)
+ assert module.get_releasebuffer_cnt() == 1
+
+ def test_Py_buffer(self):
+ module = self.import_module(name='array')
+ arr = module.array('i', [1,2,3,4])
+ assert module.get_releasebuffer_cnt() == 0
+ m = memoryview(arr)
+ assert module.get_releasebuffer_cnt() == 0
+ del m
+ self.debug_collect()
+ assert module.get_releasebuffer_cnt() == 1
+
def test_pickle(self):
import pickle
module = self.import_module(name='array')
@@ -107,7 +124,7 @@
arr = Sub('i', [2])
res = [1, 2, 3] * arr
assert res == [1, 2, 3, 1, 2, 3]
-
+
val = module.readbuffer_as_string(arr)
assert val == struct.pack('i', 2)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit