Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r46427:0e14057f1283 Date: 2011-08-10 19:02 +0200 http://bitbucket.org/pypy/pypy/changeset/0e14057f1283/
Log: merge diff --git a/lib_pypy/_ctypes/structure.py b/lib_pypy/_ctypes/structure.py --- a/lib_pypy/_ctypes/structure.py +++ b/lib_pypy/_ctypes/structure.py @@ -59,8 +59,9 @@ if name in anonymous_fields: for subname in value._names: resnames.append(subname) - relpos = startpos + value._fieldtypes[subname].offset - subvalue = value._fieldtypes[subname].ctype + subfield = getattr(value, subname) + relpos = startpos + subfield.offset + subvalue = subfield.ctype fields[subname] = Field(subname, relpos, subvalue._sizeofinstances(), subvalue, i, is_bitfield) @@ -68,7 +69,7 @@ resnames.append(name) names = resnames self._names = names - self._fieldtypes = fields + self.__dict__.update(fields) class Field(object): def __init__(self, name, offset, size, ctype, num, is_bitfield): @@ -82,6 +83,35 @@ return "<Field '%s' offset=%d size=%d>" % (self.name, self.offset, self.size) + def __get__(self, obj, cls=None): + if obj is None: + return self + if self.is_bitfield: + # bitfield member, use direct access + return obj._buffer.__getattr__(self.name) + else: + fieldtype = self.ctype + offset = self.num + suba = obj._subarray(fieldtype, self.name) + return fieldtype._CData_output(suba, obj, offset) + + + def __set__(self, obj, value): + fieldtype = self.ctype + cobj = fieldtype.from_param(value) + if ensure_objects(cobj) is not None: + key = keepalive_key(self.num) + store_reference(obj, key, cobj._objects) + arg = cobj._get_buffer_value() + if fieldtype._fficompositesize is not None: + from ctypes import memmove + dest = obj._buffer.fieldaddress(self.name) + memmove(dest, arg, fieldtype._fficompositesize) + else: + obj._buffer.__setattr__(self.name, arg) + + + # ________________________________________________________________ def _set_shape(tp, rawfields, is_union=False): @@ -90,11 +120,6 @@ tp._ffiargshape = tp._ffishape = (tp._ffistruct, 1) tp._fficompositesize = tp._ffistruct.size -def struct_getattr(self, name): - if name not in ('_fields_', '_fieldtypes'): - if hasattr(self, '_fieldtypes') and name in self._fieldtypes: - return self._fieldtypes[name] - return _CDataMeta.__getattribute__(self, name) def struct_setattr(self, name, value): if name == '_fields_': @@ -138,10 +163,8 @@ if '_fields_' not in self.__dict__: self._fields_ = [] self._names = [] - self._fieldtypes = {} _set_shape(self, [], self._is_union) - __getattr__ = struct_getattr __setattr__ = struct_setattr def from_address(self, address): @@ -211,40 +234,6 @@ A = _rawffi.Array(fieldtype._ffishape) return A.fromaddress(address, 1) - def __setattr__(self, name, value): - try: - field = self._fieldtypes[name] - except KeyError: - return _CData.__setattr__(self, name, value) - fieldtype = field.ctype - cobj = fieldtype.from_param(value) - if ensure_objects(cobj) is not None: - key = keepalive_key(field.num) - store_reference(self, key, cobj._objects) - arg = cobj._get_buffer_value() - if fieldtype._fficompositesize is not None: - from ctypes import memmove - dest = self._buffer.fieldaddress(name) - memmove(dest, arg, fieldtype._fficompositesize) - else: - self._buffer.__setattr__(name, arg) - - def __getattribute__(self, name): - if name == '_fieldtypes': - return _CData.__getattribute__(self, '_fieldtypes') - try: - field = self._fieldtypes[name] - except KeyError: - return _CData.__getattribute__(self, name) - if field.is_bitfield: - # bitfield member, use direct access - return self._buffer.__getattr__(name) - else: - fieldtype = field.ctype - offset = field.num - suba = self._subarray(fieldtype, name) - return fieldtype._CData_output(suba, self, offset) - def _get_buffer_for_param(self): return self _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit