[pypy-commit] pypy default: Issue #2621
arigo
pypy.commits at gmail.com
Sun Aug 6 12:44:27 EDT 2017
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r92101:f58c6966c54d
Date: 2017-08-06 18:43 +0200
http://bitbucket.org/pypy/pypy/changeset/f58c6966c54d/
Log: Issue #2621
Hack around until we support duplicate field names like ctypes
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
@@ -40,6 +40,22 @@
else:
rawfields.append((f[0], f[1]._ffishape_))
+ # hack for duplicate field names
+ already_seen = set()
+ names1 = names
+ names = []
+ for f in names1:
+ if f not in already_seen:
+ names.append(f)
+ already_seen.add(f)
+ already_seen = set()
+ for i in reversed(range(len(rawfields))):
+ if rawfields[i][0] in already_seen:
+ rawfields[i] = (('$DUP%d$%s' % (i, rawfields[i][0]),)
+ + rawfields[i][1:])
+ already_seen.add(rawfields[i][0])
+ # /hack
+
_set_shape(self, rawfields, self._is_union)
fields = {}
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
@@ -562,3 +562,13 @@
x = X()
assert x.x == 0
+
+ def test_duplicate_names(self):
+ class S(Structure):
+ _fields_ = [('a', c_int),
+ ('b', c_int),
+ ('a', c_byte)]
+ s = S(260, -123)
+ assert sizeof(s) == 3 * sizeof(c_int)
+ assert s.a == 4 # 256 + 4
+ assert s.b == -123
More information about the pypy-commit
mailing list