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

Reply via email to