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