|
1 | 1 | import sys
|
2 | 2 | import unittest
|
3 |
| -from ctypes import (Structure, Union, POINTER, cast, sizeof, addressof, |
4 |
| - c_void_p, c_char_p, c_wchar_p, |
5 |
| - c_byte, c_short, c_int) |
| 3 | +from ctypes import (Structure, Union, pointer, POINTER, sizeof, addressof, |
| 4 | + c_void_p, c_char_p, c_wchar_p, cast, |
| 5 | + c_byte, c_short, c_int, c_int16) |
6 | 6 |
|
7 | 7 |
|
8 | 8 | class Test(unittest.TestCase):
|
@@ -95,6 +95,71 @@ class MyUnion(Union):
|
95 | 95 | _fields_ = [("a", c_int)]
|
96 | 96 | self.assertRaises(TypeError, cast, array, MyUnion)
|
97 | 97 |
|
| 98 | + def test_pointer_identity(self): |
| 99 | + class Struct(Structure): |
| 100 | + _fields_ = [('a', c_int16)] |
| 101 | + Struct3 = 3 * Struct |
| 102 | + c_array = (2 * Struct3)( |
| 103 | + Struct3(Struct(a=1), Struct(a=2), Struct(a=3)), |
| 104 | + Struct3(Struct(a=4), Struct(a=5), Struct(a=6)) |
| 105 | + ) |
| 106 | + self.assertEqual(c_array[0][0].a, 1) |
| 107 | + self.assertEqual(c_array[0][1].a, 2) |
| 108 | + self.assertEqual(c_array[0][2].a, 3) |
| 109 | + self.assertEqual(c_array[1][0].a, 4) |
| 110 | + self.assertEqual(c_array[1][1].a, 5) |
| 111 | + self.assertEqual(c_array[1][2].a, 6) |
| 112 | + p_obj = cast(pointer(c_array), POINTER(pointer(c_array)._type_)) |
| 113 | + obj = p_obj.contents |
| 114 | + self.assertEqual(obj[0][0].a, 1) |
| 115 | + self.assertEqual(obj[0][1].a, 2) |
| 116 | + self.assertEqual(obj[0][2].a, 3) |
| 117 | + self.assertEqual(obj[1][0].a, 4) |
| 118 | + self.assertEqual(obj[1][1].a, 5) |
| 119 | + self.assertEqual(obj[1][2].a, 6) |
| 120 | + p_obj = cast(pointer(c_array[0]), POINTER(pointer(c_array)._type_)) |
| 121 | + obj = p_obj.contents |
| 122 | + self.assertEqual(obj[0][0].a, 1) |
| 123 | + self.assertEqual(obj[0][1].a, 2) |
| 124 | + self.assertEqual(obj[0][2].a, 3) |
| 125 | + self.assertEqual(obj[1][0].a, 4) |
| 126 | + self.assertEqual(obj[1][1].a, 5) |
| 127 | + self.assertEqual(obj[1][2].a, 6) |
| 128 | + StructPointer = POINTER(Struct) |
| 129 | + s1 = Struct(a=10) |
| 130 | + s2 = Struct(a=20) |
| 131 | + s3 = Struct(a=30) |
| 132 | + pointer_array = (3 * StructPointer)(pointer(s1), pointer(s2), pointer(s3)) |
| 133 | + self.assertEqual(pointer_array[0][0].a, 10) |
| 134 | + self.assertEqual(pointer_array[1][0].a, 20) |
| 135 | + self.assertEqual(pointer_array[2][0].a, 30) |
| 136 | + self.assertEqual(pointer_array[0].contents.a, 10) |
| 137 | + self.assertEqual(pointer_array[1].contents.a, 20) |
| 138 | + self.assertEqual(pointer_array[2].contents.a, 30) |
| 139 | + p_obj = cast(pointer(pointer_array[0]), POINTER(pointer(pointer_array)._type_)) |
| 140 | + obj = p_obj.contents |
| 141 | + self.assertEqual(obj[0][0].a, 10) |
| 142 | + self.assertEqual(obj[1][0].a, 20) |
| 143 | + self.assertEqual(obj[2][0].a, 30) |
| 144 | + self.assertEqual(obj[0].contents.a, 10) |
| 145 | + self.assertEqual(obj[1].contents.a, 20) |
| 146 | + self.assertEqual(obj[2].contents.a, 30) |
| 147 | + class StructWithPointers(Structure): |
| 148 | + _fields_ = [("s1", POINTER(Struct)), ("s2", POINTER(Struct))] |
| 149 | + struct = StructWithPointers(s1=pointer(s1), s2=pointer(s2)) |
| 150 | + p_obj = pointer(struct) |
| 151 | + obj = p_obj.contents |
| 152 | + self.assertEqual(obj.s1[0].a, 10) |
| 153 | + self.assertEqual(obj.s2[0].a, 20) |
| 154 | + self.assertEqual(obj.s1.contents.a, 10) |
| 155 | + self.assertEqual(obj.s2.contents.a, 20) |
| 156 | + p_obj = cast(pointer(struct), POINTER(pointer(pointer_array)._type_)) |
| 157 | + obj = p_obj.contents |
| 158 | + self.assertEqual(obj[0][0].a, 10) |
| 159 | + self.assertEqual(obj[1][0].a, 20) |
| 160 | + self.assertEqual(obj[0].contents.a, 10) |
| 161 | + self.assertEqual(obj[1].contents.a, 20) |
| 162 | + |
98 | 163 |
|
99 | 164 | if __name__ == "__main__":
|
100 | 165 | unittest.main()
|
0 commit comments