Author: Armin Rigo <[email protected]>
Branch:
Changeset: r60956:19b642a3d0a9
Date: 2013-02-08 09:11 +0100
http://bitbucket.org/pypy/pypy/changeset/19b642a3d0a9/
Log: Port cffi 00f0e57fce9a.
diff --git a/pypy/module/_cffi_backend/cbuffer.py
b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -2,7 +2,7 @@
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter.buffer import RWBuffer
from pypy.interpreter.gateway import unwrap_spec, interp2app
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, make_weakref_descr
from rpython.rtyper.lltypesystem import rffi
from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray
@@ -41,8 +41,9 @@
# a different subclass of Wrappable for the MiniBuffer, because we
# want a slightly different (simplified) API at the level of Python.
- def __init__(self, buffer):
+ def __init__(self, buffer, keepalive=None):
self.buffer = buffer
+ self.keepalive = keepalive
def descr_len(self, space):
return self.buffer.descr_len(space)
@@ -65,6 +66,7 @@
__getitem__ = interp2app(MiniBuffer.descr_getitem),
__setitem__ = interp2app(MiniBuffer.descr_setitem),
__buffer__ = interp2app(MiniBuffer.descr__buffer__),
+ __weakref__ = make_weakref_descr(MiniBuffer),
)
MiniBuffer.typedef.acceptable_as_base_class = False
@@ -86,4 +88,4 @@
raise operationerrfmt(space.w_TypeError,
"don't know the size pointed to by '%s'",
ctype.name)
- return space.wrap(MiniBuffer(LLBuffer(cdata._cdata, size)))
+ return space.wrap(MiniBuffer(LLBuffer(cdata._cdata, size), cdata))
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -12,6 +12,7 @@
return eval('u'+repr(other).replace(r'\\u', r'\u')
.replace(r'\\U', r'\U'))
u = U()
+ str2bytes = str
else:
type_or_class = "class"
long = int
@@ -22,6 +23,7 @@
bytechr = lambda n: bytes([n])
bitem2bchr = bytechr
u = ""
+ str2bytes = lambda s: bytes(s, "ascii")
def size_of_int():
BInt = new_primitive_type("int")
@@ -1438,10 +1440,16 @@
import _weakref
BInt = new_primitive_type("int")
BPtr = new_pointer_type(BInt)
- _weakref.ref(BInt)
- _weakref.ref(newp(BPtr, 42))
- _weakref.ref(cast(BPtr, 42))
- _weakref.ref(cast(BInt, 42))
+ rlist = [_weakref.ref(BInt),
+ _weakref.ref(newp(BPtr, 42)),
+ _weakref.ref(cast(BPtr, 42)),
+ _weakref.ref(cast(BInt, 42)),
+ _weakref.ref(buffer(newp(BPtr, 42))),
+ ]
+ for i in range(5):
+ import gc; gc.collect()
+ if [r() for r in rlist] == [None for r in rlist]:
+ break
def test_no_inheritance():
BInt = new_primitive_type("int")
@@ -2544,3 +2552,15 @@
BCharP = new_pointer_type(new_primitive_type("char"))
BCharArray = new_array_type(BCharP, None)
py.test.raises(TypeError, newp, BCharArray, u+'foobar')
+
+def test_buffer_keepalive():
+ BCharP = new_pointer_type(new_primitive_type("char"))
+ BCharArray = new_array_type(BCharP, None)
+ buflist = []
+ for i in range(20):
+ c = newp(BCharArray, str2bytes("hi there %d" % i))
+ buflist.append(buffer(c))
+ import gc; gc.collect()
+ for i in range(20):
+ buf = buflist[i]
+ assert buf[:] == str2bytes("hi there %d\x00" % i)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit