[pypy-commit] pypy ffi-backend: Support weakref. Split the <cdata> into two app-level classes like in

arigo noreply at buildbot.pypy.org
Tue Jun 26 11:27:16 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55828:af108d2aceb0
Date: 2012-06-25 21:54 +0200
http://bitbucket.org/pypy/pypy/changeset/af108d2aceb0/

Log:	Support weakref. Split the <cdata> into two app-level classes like
	in CPython.

diff --git a/pypy/module/_ffi_backend/cdataobj.py b/pypy/module/_ffi_backend/cdataobj.py
--- a/pypy/module/_ffi_backend/cdataobj.py
+++ b/pypy/module/_ffi_backend/cdataobj.py
@@ -2,7 +2,7 @@
 from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.interpreter.baseobjspace import Wrappable
 from pypy.interpreter.gateway import interp2app, unwrap_spec
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, make_weakref_descr
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rlib.objectmodel import keepalive_until_here, specialize
 from pypy.rlib import objectmodel, rgc
@@ -23,11 +23,7 @@
         self.ctype = ctype
 
     def repr(self):
-        extra = self.extra_repr()
-        return self.space.wrap("<cdata '%s'%s>" % (self.ctype.name, extra))
-
-    def extra_repr(self):
-        return ''
+        return self.space.wrap("<cdata '%s'>" % (self.ctype.name,))
 
     def nonzero(self):
         return self.space.wrap(bool(self._cdata))
@@ -209,8 +205,9 @@
 
 class W_CDataOwn(W_CDataOwnFromCasted):
 
-    def extra_repr(self):
-        return ' owning %d bytes' % (self.ctype.size,)
+    def repr(self):
+        return self.space.wrap("<cdata '%s' owning %d bytes>" % (
+            self.ctype.name, self.ctype.size))
 
 
 class W_CDataOwnLength(W_CDataOwn):
@@ -223,9 +220,7 @@
         return self.length
 
 
-W_CData.typedef = TypeDef(
-    '_ffi_backend.CData',
-    __repr__ = interp2app(W_CData.repr),
+common_methods = dict(
     __nonzero__ = interp2app(W_CData.nonzero),
     __int__ = interp2app(W_CData.int),
     __long__ = interp2app(W_CData.long),
@@ -241,5 +236,20 @@
     __sub__ = interp2app(W_CData.sub),
     __getattr__ = interp2app(W_CData.getattr),
     __setattr__ = interp2app(W_CData.setattr),
+)
+
+W_CData.typedef = TypeDef(
+    '_ffi_backend.CData',
+    __repr__ = interp2app(W_CData.repr),
+    **common_methods
     )
 W_CData.typedef.acceptable_as_base_class = False
+
+W_CDataOwn.typedef = TypeDef(
+    '_ffi_backend.CDataOwn',
+    __base = W_CData.typedef,
+    __repr__ = interp2app(W_CDataOwn.repr),
+    __weakref__ = make_weakref_descr(W_CDataOwn),
+    **common_methods
+    )
+W_CDataOwn.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/_ffi_backend/ctypeobj.py b/pypy/module/_ffi_backend/ctypeobj.py
--- a/pypy/module/_ffi_backend/ctypeobj.py
+++ b/pypy/module/_ffi_backend/ctypeobj.py
@@ -2,6 +2,7 @@
 from pypy.interpreter.baseobjspace import Wrappable
 from pypy.interpreter.gateway import interp2app, unwrap_spec
 from pypy.interpreter.typedef import TypeDef, interp_attrproperty
+from pypy.interpreter.typedef import make_weakref_descr
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi
 from pypy.rlib.rarithmetic import intmask, ovfcheck, r_ulonglong
 from pypy.rlib.objectmodel import keepalive_until_here, we_are_translated
@@ -694,6 +695,7 @@
 W_CType.typedef = TypeDef(
     '_ffi_backend.CTypeDescr',
     __repr__ = interp2app(W_CType.repr),
+    __weakref__ = make_weakref_descr(W_CType),
     )
 W_CType.typedef.acceptable_as_base_class = False
 


More information about the pypy-commit mailing list