[Python-modules-commits] r25713 - in packages/python-cffi/trunk/debian (4 files)
stefanor at users.alioth.debian.org
stefanor at users.alioth.debian.org
Sun Sep 1 15:41:43 UTC 2013
Date: Sunday, September 1, 2013 @ 15:41:41
Author: stefanor
Revision: 25713
Patch: big-endian-bitfields. Handle bitfields correctly on big endian
archs.
Added:
packages/python-cffi/trunk/debian/patches/
packages/python-cffi/trunk/debian/patches/big-endian-bitfields
packages/python-cffi/trunk/debian/patches/series
Modified:
packages/python-cffi/trunk/debian/changelog
Modified: packages/python-cffi/trunk/debian/changelog
===================================================================
--- packages/python-cffi/trunk/debian/changelog 2013-09-01 14:53:31 UTC (rev 25712)
+++ packages/python-cffi/trunk/debian/changelog 2013-09-01 15:41:41 UTC (rev 25713)
@@ -1,3 +1,10 @@
+python-cffi (0.7.2-2) unstable; urgency=low
+
+ * Patch: big-endian-bitfields. Handle bitfields correctly on big endian
+ archs.
+
+ -- Stefano Rivera <stefanor at debian.org> Sun, 01 Sep 2013 17:41:20 +0200
+
python-cffi (0.7.2-1) unstable; urgency=low
[ Stefano Rivera ]
Added: packages/python-cffi/trunk/debian/patches/big-endian-bitfields
===================================================================
--- packages/python-cffi/trunk/debian/patches/big-endian-bitfields (rev 0)
+++ packages/python-cffi/trunk/debian/patches/big-endian-bitfields 2013-09-01 15:41:41 UTC (rev 25713)
@@ -0,0 +1,156 @@
+Description: Fix bitfields on big-endian machines
+Author: Armin Rigo <arigo at tunes.org>
+Bug-Upstream: https://bitbucket.org/cffi/cffi/issue/100/big-endian-regressions
+Origin: upstream, https://bitbucket.org/cffi/cffi/commits/98de7e466ace
+Last-Updated: 2013-09-01
+
+--- a/c/_cffi_backend.c
++++ b/c/_cffi_backend.c
+@@ -3489,6 +3489,7 @@
+
+ #define SF_MSVC_BITFIELDS 1
+ #define SF_GCC_ARM_BITFIELDS 2
++#define SF_GCC_BIG_ENDIAN 4
+
+ static PyObject *b_complete_struct_or_union(PyObject *self, PyObject *args)
+ {
+@@ -3508,6 +3509,9 @@
+ # else
+ int sflags = 0;
+ # endif
++ int _check_endian = 1;
++ if (*(char *)&_check_endian == 0)
++ sflags |= SF_GCC_BIG_ENDIAN;
+ #endif
+
+ if (!PyArg_ParseTuple(args, "O!O!|Onii:complete_struct_or_union",
+@@ -3743,6 +3747,9 @@
+ field_offset_bytes = boffset / 8 - ftype->ct_size;
+ }
+
++ if (sflags & SF_GCC_BIG_ENDIAN)
++ bitshift = 8 * ftype->ct_size - fbitsize - bitshift;
++
+ *previous = _add_field(interned_fields, fname, ftype,
+ field_offset_bytes, bitshift, fbitsize);
+ if (*previous == NULL)
+--- a/c/test_c.py
++++ b/c/test_c.py
+@@ -1527,13 +1527,18 @@
+ d = BStruct.fields
+ assert d[0][1].offset == d[1][1].offset == d[2][1].offset == 0
+ assert d[3][1].offset == sizeof(BLong)
+- assert d[0][1].bitshift == 0
++ def f(m, r):
++ if sys.byteorder == 'little':
++ return r
++ else:
++ return LONGBITS - m - r
++ assert d[0][1].bitshift == f(1, 0)
+ assert d[0][1].bitsize == 1
+- assert d[1][1].bitshift == 1
++ assert d[1][1].bitshift == f(2, 1)
+ assert d[1][1].bitsize == 2
+- assert d[2][1].bitshift == 3
++ assert d[2][1].bitshift == f(3, 3)
+ assert d[2][1].bitsize == 3
+- assert d[3][1].bitshift == 0
++ assert d[3][1].bitshift == f(LONGBITS - 5, 0)
+ assert d[3][1].bitsize == LONGBITS - 5
+ assert sizeof(BStruct) == 2 * sizeof(BLong)
+ assert alignof(BStruct) == alignof(BLong)
+@@ -2867,7 +2872,7 @@
+ ('b1', BInt, 9),
+ ('b2', BUInt, 7),
+ ('c', BChar, -1)], -1, -1, -1, flag)
+- if flag % 2 == 0: # gcc and gcc ARM
++ if flag % 2 == 0: # gcc, any variant
+ assert typeoffsetof(BStruct, 'c') == (BChar, 3)
+ assert sizeof(BStruct) == 4
+ else: # msvc
+@@ -2875,6 +2880,31 @@
+ assert sizeof(BStruct) == 12
+ assert alignof(BStruct) == 4
+ #
++ p = newp(new_pointer_type(BStruct), None)
++ p.a = b'A'
++ p.b1 = -201
++ p.b2 = 99
++ p.c = b'\x9D'
++ raw = buffer(p)[:]
++ if sys.byteorder == 'little':
++ if flag == 0 or flag == 2: # gcc, little endian
++ assert raw == b'A7\xC7\x9D'
++ elif flag == 1: # msvc
++ assert raw == b'A\x00\x00\x007\xC7\x00\x00\x9D\x00\x00\x00'
++ elif flag == 4: # gcc, big endian
++ assert raw == b'A\xE3\x9B\x9D'
++ else:
++ raise AssertionError("bad flag")
++ else:
++ if flag == 0 or flag == 2: # gcc
++ assert raw == b'A\xC77\x9D'
++ elif flag == 1: # msvc
++ assert raw == b'A\x00\x00\x00\x00\x00\xC77\x9D\x00\x00\x00'
++ elif flag == 4: # gcc, big endian
++ assert raw == b'A\x9B\xE3\x9D'
++ else:
++ raise AssertionError("bad flag")
++ #
+ BStruct = new_struct_type("struct foo2")
+ complete_struct_or_union(BStruct, [('a', BChar, -1),
+ ('', BShort, 9),
+@@ -2886,16 +2916,21 @@
+ elif flag == 1: # msvc
+ assert sizeof(BStruct) == 6
+ assert alignof(BStruct) == 2
+- else: # gcc ARM
++ elif flag == 2: # gcc ARM
+ assert sizeof(BStruct) == 6
+ assert alignof(BStruct) == 2
++ elif flag == 4: # gcc, big endian
++ assert sizeof(BStruct) == 5
++ assert alignof(BStruct) == 1
++ else:
++ raise AssertionError("bad flag")
+ #
+ BStruct = new_struct_type("struct foo2")
+ complete_struct_or_union(BStruct, [('a', BChar, -1),
+ ('', BInt, 0),
+ ('', BInt, 0),
+ ('c', BChar, -1)], -1, -1, -1, flag)
+- if flag == 0: # gcc
++ if flag == 0: # gcc
+ assert typeoffsetof(BStruct, 'c') == (BChar, 4)
+ assert sizeof(BStruct) == 5
+ assert alignof(BStruct) == 1
+@@ -2903,10 +2938,16 @@
+ assert typeoffsetof(BStruct, 'c') == (BChar, 1)
+ assert sizeof(BStruct) == 2
+ assert alignof(BStruct) == 1
+- else: # gcc ARM
++ elif flag == 2: # gcc ARM
+ assert typeoffsetof(BStruct, 'c') == (BChar, 4)
+ assert sizeof(BStruct) == 8
+ assert alignof(BStruct) == 4
++ elif flag == 4: # gcc, big endian
++ assert typeoffsetof(BStruct, 'c') == (BChar, 4)
++ assert sizeof(BStruct) == 5
++ assert alignof(BStruct) == 1
++ else:
++ raise AssertionError("bad flag")
+
+
+ def test_bitfield_as_gcc():
+@@ -2918,6 +2959,11 @@
+ def test_bitfield_as_arm_gcc():
+ _test_bitfield_details(flag=2)
+
++def test_bitfield_as_big_endian():
++ if '__pypy__' in sys.builtin_module_names:
++ py.test.skip("no big endian machine supported on pypy for now")
++ _test_bitfield_details(flag=4)
++
+
+ def test_version():
+ # this test is here mostly for PyPy
Added: packages/python-cffi/trunk/debian/patches/series
===================================================================
--- packages/python-cffi/trunk/debian/patches/series (rev 0)
+++ packages/python-cffi/trunk/debian/patches/series 2013-09-01 15:41:41 UTC (rev 25713)
@@ -0,0 +1 @@
+big-endian-bitfields
More information about the Python-modules-commits
mailing list