[pypy-commit] pypy issue2444: try with _finalize_, but it is called too early
mattip
pypy.commits at gmail.com
Mon Dec 12 16:44:51 EST 2016
Author: Matti Picus <matti.picus at 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
More information about the pypy-commit
mailing list