from ctypes import (
c_char, c_uint32, c_uint16, c_ubyte, c_byte, alignment, sizeof,
BigEndianStructure, LittleEndianStructure,
- BigEndianUnion, LittleEndianUnion,
+ BigEndianUnion, LittleEndianUnion, Structure
)
import struct
import unittest
self.assertEqual(main.b.y, 3)
self.assertEqual(main.c, 4)
+ def test_negative_align(self):
+ for base in (Structure, LittleEndianStructure, BigEndianStructure):
+ with (
+ self.subTest(base=base),
+ self.assertRaisesRegex(
+ ValueError,
+ '_align_ must be a non-negative integer',
+ )
+ ):
+ class MyStructure(base):
+ _align_ = -1
+ _fields_ = []
+
+ def test_zero_align_no_fields(self):
+ for base in (Structure, LittleEndianStructure, BigEndianStructure):
+ with self.subTest(base=base):
+ class MyStructure(base):
+ _align_ = 0
+ _fields_ = []
+
+ self.assertEqual(alignment(MyStructure), 1)
+ self.assertEqual(alignment(MyStructure()), 1)
+
+ def test_zero_align_with_fields(self):
+ for base in (Structure, LittleEndianStructure, BigEndianStructure):
+ with self.subTest(base=base):
+ class MyStructure(base):
+ _align_ = 0
+ _fields_ = [
+ ("x", c_ubyte),
+ ]
+
+ self.assertEqual(alignment(MyStructure), 1)
+ self.assertEqual(alignment(MyStructure()), 1)
+
if __name__ == '__main__':
unittest.main()
size = 0;
align = 0;
union_size = 0;
- total_align = forced_alignment;
+ total_align = forced_alignment == 0 ? 1 : forced_alignment;
stginfo->ffi_type_pointer.type = FFI_TYPE_STRUCT;
stginfo->ffi_type_pointer.elements = PyMem_New(ffi_type *, len + 1);
if (stginfo->ffi_type_pointer.elements == NULL) {
}
/* Adjust the size according to the alignment requirements */
+ assert(total_align != 0);
aligned_size = ((size + total_align - 1) / total_align) * total_align;
if (isStruct) {