Author: Matti Picus <matti.pi...@gmail.com>
Branch: issue2444
Changeset: r89035:fb9619c1a00a
Date: 2016-12-12 23:43 +0200
http://bitbucket.org/pypy/pypy/changeset/fb9619c1a00a/

Log:    try with _finalize_, but it is called too early

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
@@ -340,11 +340,12 @@
         self.ndim = ndim
         self.itemsize = itemsize
         self.readonly = readonly
-        self.releasebuffer = releasebuffer
+        self.releasebufferproc = releasebuffer
 
-    def __del__(self):
-        if self.releasebuffer:
-            func_target = rffi.cast(releasebufferproc, self.releasebuffer)
+    def releasebuffer(self):
+        print '--------------'
+        if self.releasebufferproc:        
+            func_target = rffi.cast(releasebufferproc, self.releasebufferproc)
             with lltype.scoped_alloc(Py_buffer) as pybuf:
                 pybuf.c_buf = self.ptr
                 pybuf.c_len = self.size
@@ -354,6 +355,7 @@
                     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
 
     def getlength(self):
         return self.size
diff --git a/pypy/module/cpyext/test/test_bufferobject.py 
b/pypy/module/cpyext/test/test_bufferobject.py
--- a/pypy/module/cpyext/test/test_bufferobject.py
+++ b/pypy/module/cpyext/test/test_bufferobject.py
@@ -114,7 +114,9 @@
             """, )
         import gc
         assert module.get_cnt() == 0
+        print '++++++++++++++++++'
         a = memoryview(module.create_test())
+        print 'xxxxxxxxxxxxxxxxxxxxxxx'
         assert module.get_cnt() == 1
         del a
         assert module.get_cnt() == 0
diff --git a/pypy/objspace/std/bufferobject.py 
b/pypy/objspace/std/bufferobject.py
--- a/pypy/objspace/std/bufferobject.py
+++ b/pypy/objspace/std/bufferobject.py
@@ -17,6 +17,9 @@
         assert isinstance(buf, Buffer)
         self.buf = buf
 
+    def _finalize_(self):
+        return self.buf.releasebuffer()
+
     def buffer_w(self, space, flags):
         space.check_buf_flags(flags, self.buf.readonly)
         return self.buf
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -321,8 +321,10 @@
     def newseqiter(self, w_obj):
         return W_SeqIterObject(w_obj)
 
-    def newbuffer(self, w_obj):
-        return W_Buffer(w_obj)
+    def newbuffer(self, obj):
+        ret = W_Buffer(obj)
+        ret.register_finalizer(self)
+        return ret
 
     def newbytes(self, s):
         return W_BytesObject(s)
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -75,6 +75,9 @@
     def getstrides(self):
         return [1]
 
+    def releasebuffer(self):
+        pass
+
 class StringBuffer(Buffer):
     __slots__ = ['value']
     _immutable_ = True
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to