Author: Matti Picus <[email protected]>
Branch: issue2444
Changeset: r89173:bfce98836768
Date: 2016-12-18 23:24 +0200
http://bitbucket.org/pypy/pypy/changeset/bfce98836768/

Log:    translation fixes, redo self.pyobj to avoid
        check_graph_of_del_does_not_call_too_much() error

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
@@ -14,7 +14,7 @@
     ssizessizeargfunc, ssizeobjargproc, iternextfunc, initproc, richcmpfunc,
     cmpfunc, hashfunc, descrgetfunc, descrsetfunc, objobjproc, objobjargproc,
     readbufferproc, getbufferproc, releasebufferproc, ssizessizeobjargproc)
-from pypy.module.cpyext.pyobject import make_ref, Py_DecRef
+from pypy.module.cpyext.pyobject import make_ref, decref
 from pypy.module.cpyext.pyerrors import PyErr_Occurred
 from pypy.module.cpyext.memoryobject import fill_Py_buffer
 from pypy.module.cpyext.state import State
@@ -99,7 +99,7 @@
     if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
         not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
         return space.w_NotImplemented
-    Py_DecRef(space, ref)
+    decref(space, ref)
     return generic_cpy_call(space, func_binary, w_self, args_w[0])
 
 def wrap_binaryfunc_r(space, w_self, w_args, func):
@@ -110,7 +110,7 @@
     if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
         not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
         return space.w_NotImplemented
-    Py_DecRef(space, ref)
+    decref(space, ref)
     return generic_cpy_call(space, func_binary, args_w[0], w_self)
 
 def wrap_ternaryfunc(space, w_self, w_args, func):
@@ -132,7 +132,7 @@
     if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
         not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
         return space.w_NotImplemented
-    Py_DecRef(space, ref)
+    decref(space, ref)
     arg3 = space.w_None
     if len(args_w) > 1:
         arg3 = args_w[1]
@@ -329,6 +329,7 @@
         self.ptr = ptr
         self.size = size
         self.w_obj = w_obj # kept alive
+        self.pyobj = make_ref(space, w_obj)
         self.format = format
         if not shape:
             self.shape = [size]
@@ -344,6 +345,12 @@
         self.releasebufferproc = releasebuffer
 
     def releasebuffer(self):
+        if self.pyobj:
+            decref(self.space, self.pyobj)
+            self.pyobj = lltype.nullptr(PyObject.TO)
+        else:
+            #do not call twice
+            return
         if self.releasebufferproc:        
             func_target = rffi.cast(releasebufferproc, self.releasebufferproc)
             with lltype.scoped_alloc(Py_buffer) as pybuf:
@@ -354,8 +361,8 @@
                     pybuf.c_shape[i] = self.shape[i]
                     pybuf.c_strides[i] = self.strides[i]
                 pybuf.c_format = rffi.str2charp(self.format)
-                generic_cpy_call(self.space, func_target, self.w_obj, pybuf)
-            self.releasebufferproc = None
+                generic_cpy_call(self.space, func_target, self.pyobj, pybuf)
+            self.releasebufferproc = rffi.cast(rffi.VOIDP, 0)
 
     def getlength(self):
         return self.size
@@ -400,7 +407,11 @@
     func_target = rffi.cast(readbufferproc, func)
     py_obj = make_ref(space, w_self)
     py_type = py_obj.c_ob_type
-    releasebuffer = py_type.c_tp_as_buffer and 
py_type.c_tp_as_buffer.c_bf_releasebuffer
+    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)
@@ -408,14 +419,19 @@
             space.fromcache(State).check_and_raise_exception(always=True)
         buf = CPyBuffer(space, ptr[0], size, w_self, 
                                releasebuffer=releasebuffer)
-        fq.register_finalizer(buf)
+        if need_finalizer:
+            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
-    releasebuffer = py_type.c_tp_as_buffer and 
py_type.c_tp_as_buffer.c_bf_releasebuffer
+    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)
@@ -423,14 +439,19 @@
             space.fromcache(State).check_and_raise_exception(always=True)
         buf = CPyBuffer(space, ptr[0], size, w_self, readonly=False,
                                releasebuffer=releasebuffer)
-        fq.register_finalizer(buf)
+        if need_finalizer:
+            fq.register_finalizer(buf)
         return space.newbuffer(buf)
 
 def wrap_getbuffer(space, w_self, w_args, func):
     func_target = rffi.cast(getbufferproc, func)
     py_obj = make_ref(space, w_self)
     py_type = py_obj.c_ob_type
-    releasebuffer = py_type.c_tp_as_buffer and 
py_type.c_tp_as_buffer.c_bf_releasebuffer
+    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(Py_buffer) as pybuf:
         _flags = 0
         if space.len_w(w_args) > 0:
@@ -456,7 +477,8 @@
                             itemsize=pybuf.c_itemsize,
                             readonly=widen(pybuf.c_readonly),
                             releasebuffer = releasebuffer)
-        fq.register_finalizer(buf)
+        if need_finalizer:
+            fq.register_finalizer(buf)
         return space.newbuffer(buf)
 
 def get_richcmp_func(OP_CONST):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to