[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