Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r92032:53cb371f1828 Date: 2017-08-02 15:49 +0200 http://bitbucket.org/pypy/pypy/changeset/53cb371f1828/
Log: Call add_memory_pressure(size) in response to ffi.gc(..., size) diff --git a/pypy/module/_cffi_backend/cdataobj.py b/pypy/module/_cffi_backend/cdataobj.py --- a/pypy/module/_cffi_backend/cdataobj.py +++ b/pypy/module/_cffi_backend/cdataobj.py @@ -433,17 +433,22 @@ def _sizeof(self): return self.ctype.size - def with_gc(self, w_destructor): + def with_gc(self, w_destructor, size=0): space = self.space if space.is_none(w_destructor): if isinstance(self, W_CDataGCP): self.detach_destructor() - return space.w_None - raise oefmt(space.w_TypeError, - "Can remove destructor only on a object " - "previously returned by ffi.gc()") - with self as ptr: - return W_CDataGCP(space, ptr, self.ctype, self, w_destructor) + w_res = space.w_None + else: + raise oefmt(space.w_TypeError, + "Can remove destructor only on a object " + "previously returned by ffi.gc()") + else: + with self as ptr: + w_res = W_CDataGCP(space, ptr, self.ctype, self, w_destructor) + if size != 0: + rgc.add_memory_pressure(size) + return w_res def unpack(self, length): from pypy.module._cffi_backend.ctypeptr import W_CTypePtrOrArray diff --git a/pypy/module/_cffi_backend/ffi_obj.py b/pypy/module/_cffi_backend/ffi_obj.py --- a/pypy/module/_cffi_backend/ffi_obj.py +++ b/pypy/module/_cffi_backend/ffi_obj.py @@ -351,14 +351,14 @@ return handle.from_handle(self.space, w_arg) - @unwrap_spec(w_cdata=W_CData) - def descr_gc(self, w_cdata, w_destructor): + @unwrap_spec(w_cdata=W_CData, size=int) + def descr_gc(self, w_cdata, w_destructor, size=0): """\ Return a new cdata object that points to the same data. Later, when this new cdata object is garbage-collected, 'destructor(old_cdata_object)' will be called.""" # - return w_cdata.with_gc(w_destructor) + return w_cdata.with_gc(w_destructor, size) @unwrap_spec(replace_with='text') diff --git a/pypy/module/_cffi_backend/func.py b/pypy/module/_cffi_backend/func.py --- a/pypy/module/_cffi_backend/func.py +++ b/pypy/module/_cffi_backend/func.py @@ -257,6 +257,6 @@ # ____________________________________________________________ -@unwrap_spec(w_cdata=cdataobj.W_CData) -def gcp(space, w_cdata, w_destructor): - return w_cdata.with_gc(w_destructor) +@unwrap_spec(w_cdata=cdataobj.W_CData, size=int) +def gcp(space, w_cdata, w_destructor, size=0): + return w_cdata.with_gc(w_destructor, size) diff --git a/pypy/module/_cffi_backend/test/test_ffi_obj.py b/pypy/module/_cffi_backend/test/test_ffi_obj.py --- a/pypy/module/_cffi_backend/test/test_ffi_obj.py +++ b/pypy/module/_cffi_backend/test/test_ffi_obj.py @@ -377,7 +377,7 @@ raises(TypeError, ffi.gc, p, None) seen = [] q1 = ffi.gc(p, lambda p: seen.append(1)) - q2 = ffi.gc(q1, lambda p: seen.append(2)) + q2 = ffi.gc(q1, lambda p: seen.append(2), size=123) import gc; gc.collect() assert seen == [] assert ffi.gc(q1, None) is None _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit