Author: Armin Rigo <[email protected]>
Branch: ffi-backend
Changeset: r55781:dfa048d6ad13
Date: 2012-06-23 16:01 +0200
http://bitbucket.org/pypy/pypy/changeset/dfa048d6ad13/
Log: read/write attributes.
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
@@ -134,6 +134,43 @@
#
return self._add_or_sub(w_other, -1)
+ def getattr(self, w_attr):
+ from pypy.module._ffi_backend import ctypeobj
+ space = self.space
+ ctype = self.ctype
+ attr = space.str_w(w_attr)
+ if (isinstance(ctype, ctypeobj.W_CTypeStructOrUnion) and
+ ctype.fields_dict is not None):
+ try:
+ cfield = ctype.fields_dict[attr]
+ except KeyError:
+ pass
+ else:
+ w_res = cfield.read(self._cdata)
+ keepalive_until_here(self)
+ return w_res
+ raise operationerrfmt(space.w_AttributeError,
+ "cdata '%s' has no attribute '%s'",
+ ctype.name, attr)
+
+ def setattr(self, w_attr, w_value):
+ from pypy.module._ffi_backend import ctypeobj
+ space = self.space
+ ctype = self.ctype
+ attr = space.str_w(w_attr)
+ if (isinstance(ctype, ctypeobj.W_CTypeStructOrUnion) and
+ ctype.fields_dict is not None):
+ try:
+ cfield = ctype.fields_dict[attr]
+ except KeyError:
+ pass
+ else:
+ cfield.write(self._cdata, w_value)
+ return
+ raise operationerrfmt(space.w_AttributeError,
+ "cdata '%s' has no attribute '%s'",
+ ctype.name, attr)
+
## def read_raw_signed_data(self):
## result = misc.read_raw_signed_data(self._cdata, self.ctype.size)
## keepalive_until_here(self)
@@ -214,5 +251,7 @@
__setitem__ = interp2app(W_CData.setitem),
__add__ = interp2app(W_CData.add),
__sub__ = interp2app(W_CData.sub),
+ __getattr__ = interp2app(W_CData.getattr),
+ __setattr__ = interp2app(W_CData.setattr),
)
W_CData.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
@@ -410,6 +410,14 @@
space.wrap(field)])
return space.newlist(result)
+ def convert_to_object(self, cdata):
+ space = self.space
+ if self.size < 0:
+ raise operationerrfmt(space.w_TypeError,
+ "cannot return an incomplete cdata '%s'",
+ self.name)
+ return cdataobj.W_CData(space, cdata, self)
+
class W_CTypeStruct(W_CTypeStructOrUnion):
kind = "struct"
@@ -425,6 +433,20 @@
self.bitshift = bitshift
self.bitsize = bitsize
+ def read(self, cdata):
+ cdata = rffi.ptradd(cdata, self.offset)
+ if self.bitshift >= 0:
+ xxx
+ else:
+ return self.ctype.convert_to_object(cdata)
+
+ def write(self, cdata, w_ob):
+ cdata = rffi.ptradd(cdata, self.offset)
+ if self.bitshift >= 0:
+ xxx
+ else:
+ self.ctype.convert_from_object(cdata, w_ob)
+
W_CType.typedef = TypeDef(
'_ffi_backend.CTypeDescr',
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit