]> granicus.if.org Git - python/commitdiff
fix ctypes test alignment assumptions (closes #20946)
authorBenjamin Peterson <benjamin@python.org>
Sun, 16 Mar 2014 09:07:26 +0000 (10:07 +0100)
committerBenjamin Peterson <benjamin@python.org>
Sun, 16 Mar 2014 09:07:26 +0000 (10:07 +0100)
Patch by Andreas Schwab.

Lib/ctypes/test/test_bitfields.py
Lib/ctypes/test/test_structures.py
Misc/NEWS
Modules/_ctypes/cfield.c

index 3bcc67fb75ef5d1c86dc006cffd42e71e5e5742b..cbeb4c62b51b7f9713116b2255726889646fe45f 100644 (file)
@@ -207,7 +207,7 @@ class BitFieldTest(unittest.TestCase):
         class X(Structure):
             _fields_ = [("a", c_byte, 4),
                         ("b", c_int, 32)]
-        self.assertEqual(sizeof(X), sizeof(c_int)*2)
+        self.assertEqual(sizeof(X), alignment(c_int)+sizeof(c_int))
 
     def test_mixed_3(self):
         class X(Structure):
index 34de767da0a4d0a2948b4bf3e4a0850bf803f498..ba7d8c0fb07b5e79b00f13126f452de9d5f55eff 100644 (file)
@@ -83,7 +83,7 @@ class StructureTestCase(unittest.TestCase):
         class Y(Structure):
             _fields_ = [("x", c_char * 3),
                         ("y", c_int)]
-        self.assertEqual(alignment(Y), calcsize("i"))
+        self.assertEqual(alignment(Y), alignment(c_int))
         self.assertEqual(sizeof(Y), calcsize("3si"))
 
         class SI(Structure):
@@ -175,23 +175,23 @@ class StructureTestCase(unittest.TestCase):
         self.assertEqual(sizeof(X), 10)
         self.assertEqual(X.b.offset, 2)
 
+        import struct
+        longlong_size = struct.calcsize("q")
+        longlong_align = struct.calcsize("bq") - longlong_size
+
         class X(Structure):
             _fields_ = [("a", c_byte),
                         ("b", c_longlong)]
             _pack_ = 4
-        self.assertEqual(sizeof(X), 12)
-        self.assertEqual(X.b.offset, 4)
-
-        import struct
-        longlong_size = struct.calcsize("q")
-        longlong_align = struct.calcsize("bq") - longlong_size
+        self.assertEqual(sizeof(X), min(4, longlong_align) + longlong_size)
+        self.assertEqual(X.b.offset, min(4, longlong_align))
 
         class X(Structure):
             _fields_ = [("a", c_byte),
                         ("b", c_longlong)]
             _pack_ = 8
 
-        self.assertEqual(sizeof(X), longlong_align + longlong_size)
+        self.assertEqual(sizeof(X), min(8, longlong_align) + longlong_size)
         self.assertEqual(X.b.offset, min(8, longlong_align))
 
 
index 99a6cf15356ff75c4dfe385483ed3e977f93d397..e2c757c1621034424e795a90ab71077ee1896746 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -271,6 +271,8 @@ IDLE
 Tests
 -----
 
+- Issue #20946: Correct alignment assumptions of some ctypes tests.
+
 - Issue #20743: Fix a reference leak in test_tcl.
 
 - Issue #20510: Rewrote test_exit in test_sys to match existing comments,
index 5e0fc759ff11d7d5ae2201ea45f2562550fd1448..76c72f877a7cdf35ffa3879bf6a586c734a29366 100644 (file)
@@ -1687,9 +1687,9 @@ typedef struct { char c; void *x; } s_void_p;
 /*
 #define CHAR_ALIGN (sizeof(s_char) - sizeof(char))
 #define SHORT_ALIGN (sizeof(s_short) - sizeof(short))
-#define INT_ALIGN (sizeof(s_int) - sizeof(int))
 #define LONG_ALIGN (sizeof(s_long) - sizeof(long))
 */
+#define INT_ALIGN (sizeof(s_int) - sizeof(int))
 #define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
 #define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
 #define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
@@ -1731,8 +1731,8 @@ ffi_type ffi_type_sint8 = { 1, 1, FFI_TYPE_SINT8 };
 ffi_type ffi_type_uint16 = { 2, 2, FFI_TYPE_UINT16 };
 ffi_type ffi_type_sint16 = { 2, 2, FFI_TYPE_SINT16 };
 
-ffi_type ffi_type_uint32 = { 4, 4, FFI_TYPE_UINT32 };
-ffi_type ffi_type_sint32 = { 4, 4, FFI_TYPE_SINT32 };
+ffi_type ffi_type_uint32 = { 4, INT_ALIGN, FFI_TYPE_UINT32 };
+ffi_type ffi_type_sint32 = { 4, INT_ALIGN, FFI_TYPE_SINT32 };
 
 ffi_type ffi_type_uint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_UINT64 };
 ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };