Author: Matti Picus <[email protected]>
Branch: issue2444
Changeset: r89232:b3bfb5b6f7e2
Date: 2016-12-25 22:35 +0200
http://bitbucket.org/pypy/pypy/changeset/b3bfb5b6f7e2/
Log: rewrite c-level tests, find a misisng decref, always run finalizer
to decref
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
@@ -408,10 +408,9 @@
py_obj = make_ref(space, w_self)
py_type = py_obj.c_ob_type
releasebuffer = rffi.cast(rffi.VOIDP, 0)
- need_finalizer = False
if py_type.c_tp_as_buffer:
releasebuffer = rffi.cast(rffi.VOIDP,
py_type.c_tp_as_buffer.c_bf_releasebuffer)
- need_finalizer = True
+ decref(space, py_obj)
with lltype.scoped_alloc(rffi.VOIDPP.TO, 1) as ptr:
index = rffi.cast(Py_ssize_t, 0)
size = generic_cpy_call(space, func_target, w_self, index, ptr)
@@ -419,19 +418,17 @@
space.fromcache(State).check_and_raise_exception(always=True)
buf = CPyBuffer(space, ptr[0], size, w_self,
releasebuffer=releasebuffer)
- if need_finalizer:
- fq.register_finalizer(buf)
+ fq.register_finalizer(buf)
return space.newbuffer(buf)
def wrap_getwritebuffer(space, w_self, w_args, func):
func_target = rffi.cast(readbufferproc, func)
py_obj = make_ref(space, w_self)
py_type = py_obj.c_ob_type
+ decref(space, py_obj)
releasebuffer = rffi.cast(rffi.VOIDP, 0)
- need_finalizer = False
if py_type.c_tp_as_buffer:
releasebuffer = rffi.cast(rffi.VOIDP,
py_type.c_tp_as_buffer.c_bf_releasebuffer)
- need_finalizer = True
with lltype.scoped_alloc(rffi.VOIDPP.TO, 1) as ptr:
index = rffi.cast(Py_ssize_t, 0)
size = generic_cpy_call(space, func_target, w_self, index, ptr)
@@ -439,8 +436,7 @@
space.fromcache(State).check_and_raise_exception(always=True)
buf = CPyBuffer(space, ptr[0], size, w_self, readonly=False,
releasebuffer=releasebuffer)
- if need_finalizer:
- fq.register_finalizer(buf)
+ fq.register_finalizer(buf)
return space.newbuffer(buf)
def wrap_getbuffer(space, w_self, w_args, func):
@@ -448,10 +444,9 @@
py_obj = make_ref(space, w_self)
py_type = py_obj.c_ob_type
releasebuffer = rffi.cast(rffi.VOIDP, 0)
- need_finalizer = False
if py_type.c_tp_as_buffer:
releasebuffer = rffi.cast(rffi.VOIDP,
py_type.c_tp_as_buffer.c_bf_releasebuffer)
- need_finalizer = True
+ decref(space, py_obj)
with lltype.scoped_alloc(Py_buffer) as pybuf:
_flags = 0
if space.len_w(w_args) > 0:
@@ -477,8 +472,7 @@
itemsize=pybuf.c_itemsize,
readonly=widen(pybuf.c_readonly),
releasebuffer = releasebuffer)
- if need_finalizer:
- fq.register_finalizer(buf)
+ fq.register_finalizer(buf)
return space.newbuffer(buf)
def get_richcmp_func(OP_CONST):
diff --git a/pypy/module/cpyext/test/buffer_test.c
b/pypy/module/cpyext/test/buffer_test.c
--- a/pypy/module/cpyext/test/buffer_test.c
+++ b/pypy/module/cpyext/test/buffer_test.c
@@ -185,19 +185,6 @@
(initproc)PyMyArray_init, /* tp_init */
};
-static PyObject*
-test_buffer(PyObject* self, PyObject* args)
-{
- Py_buffer* view = NULL;
- PyObject* obj = PyTuple_GetItem(args, 0);
- PyObject* memoryview = PyMemoryView_FromObject(obj);
- if (memoryview == NULL)
- return PyInt_FromLong(-1);
- view = PyMemoryView_GET_BUFFER(memoryview);
- Py_DECREF(memoryview);
- return PyInt_FromLong(view->len);
-}
-
/* Copied from numpy tests */
/*
* Create python string from a FLAG and or the corresponding PyBuf flag
@@ -308,7 +295,6 @@
static PyMethodDef buffer_functions[] = {
- {"test_buffer", (PyCFunction)test_buffer, METH_VARARGS, NULL},
{"get_buffer_info", (PyCFunction)get_buffer_info, METH_VARARGS, NULL},
{NULL, NULL} /* Sentinel */
};
diff --git a/pypy/module/cpyext/test/test_memoryobject.py
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -20,16 +20,16 @@
def test_frombuffer(self, space, api):
w_buf = space.newbuffer(StringBuffer("hello"))
w_memoryview = api.PyMemoryView_FromObject(w_buf)
- w_view = api.PyMemoryView_GET_BUFFER(w_memoryview)
- assert w_view.c_ndim == 1
- f = rffi.charp2str(w_view.c_format)
+ view = api.PyMemoryView_GET_BUFFER(w_memoryview)
+ assert view.c_ndim == 1
+ f = rffi.charp2str(view.c_format)
assert f == 'B'
- assert w_view.c_shape[0] == 5
- assert w_view.c_strides[0] == 1
- assert w_view.c_len == 5
- o = rffi.charp2str(w_view.c_buf)
+ assert view.c_shape[0] == 5
+ assert view.c_strides[0] == 1
+ assert view.c_len == 5
+ o = rffi.charp2str(view.c_buf)
assert o == 'hello'
- w_mv = api.PyMemoryView_FromBuffer(w_view)
+ w_mv = api.PyMemoryView_FromBuffer(view)
for f in ('format', 'itemsize', 'ndim', 'readonly',
'shape', 'strides', 'suboffsets'):
w_f = space.wrap(f)
@@ -37,7 +37,7 @@
space.getattr(w_memoryview, w_f))
class AppTestBufferProtocol(AppTestCpythonExtensionBase):
- def test_buffer_protocol(self):
+ def test_buffer_protocol_app(self):
import struct
module = self.import_module(name='buffer_test')
arr = module.PyMyArray(10)
@@ -48,8 +48,26 @@
s = y[3]
assert len(s) == struct.calcsize('i')
assert s == struct.pack('i', 3)
- viewlen = module.test_buffer(arr)
- assert viewlen == y.itemsize * len(y)
+
+ def test_buffer_protocol_capi(self):
+ foo = self.import_extension('foo', [
+ ("get_len", "METH_VARARGS",
+ """
+ Py_buffer view;
+ PyObject* obj = PyTuple_GetItem(args, 0);
+ long ret, vlen;
+ memset(&view, 0, sizeof(Py_buffer));
+ ret = PyObject_GetBuffer(obj, &view, PyBUF_FULL);
+ if (ret != 0)
+ return NULL;
+ vlen = view.len / view.itemsize;
+ PyBuffer_Release(&view);
+ return PyInt_FromLong(vlen);
+ """)])
+ module = self.import_module(name='buffer_test')
+ arr = module.PyMyArray(10)
+ ten = foo.get_len(arr)
+ assert ten == 10
@pytest.mark.skipif(only_pypy, reason='pypy only test')
def test_buffer_info(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit