Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r46161:eb30a0ef328e Date: 2011-08-01 16:06 +0000 http://bitbucket.org/pypy/pypy/changeset/eb30a0ef328e/
Log: merge heads 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 @@ -34,16 +34,18 @@ for i, field in enumerate(all_fields): name = field[0] value = field[1] + is_bitfield = (len(field) == 3) fields[name] = Field(name, self._ffistruct.fieldoffset(name), self._ffistruct.fieldsize(name), - value, i) + value, i, is_bitfield) if anonymous_fields: resnames = [] for i, field in enumerate(all_fields): name = field[0] value = field[1] + is_bitfield = (len(field) == 3) startpos = self._ffistruct.fieldoffset(name) if name in anonymous_fields: for subname in value._names: @@ -52,7 +54,7 @@ subvalue = value._fieldtypes[subname].ctype fields[subname] = Field(subname, relpos, subvalue._sizeofinstances(), - subvalue, i) + subvalue, i, is_bitfield) else: resnames.append(name) names = resnames @@ -60,8 +62,8 @@ self._fieldtypes = fields class Field(object): - def __init__(self, name, offset, size, ctype, num): - for k in ('name', 'offset', 'size', 'ctype', 'num'): + def __init__(self, name, offset, size, ctype, num, is_bitfield): + for k in ('name', 'offset', 'size', 'ctype', 'num', 'is_bitfield'): self.__dict__[k] = locals()[k] def __setattr__(self, name, value): @@ -225,7 +227,7 @@ field = self._fieldtypes[name] except KeyError: return _CData.__getattribute__(self, name) - if field.size >> 16: + if field.is_bitfield: # bitfield member, use direct access return self._buffer.__getattr__(name) else: diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_structures.py b/pypy/module/test_lib_pypy/ctypes_tests/test_structures.py --- a/pypy/module/test_lib_pypy/ctypes_tests/test_structures.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/test_structures.py @@ -424,6 +424,15 @@ sys.settrace(oldtrace) events = None + def test_large_fields(self): + # make sure that large fields are not "confused" with bitfields + # (because the bitfields use the higher bits of the "size" attribute) + Array = c_long * 8192 + class X(Structure): + _fields_ = [('items', Array)] + obj = X() + assert isinstance(obj.items, Array) + class TestPointerMember(BaseCTypesTestChecker): def test_1(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit