Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit