Skip to content

Commit d2ff7a4

Browse files
committed
WIP
1 parent 16d39d2 commit d2ff7a4

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

Lib/test/test_ctypes/test_cast.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,35 @@ class StructWithPointers(Structure):
160160
self.assertEqual(obj[0].contents.a, 10)
161161
self.assertEqual(obj[1].contents.a, 20)
162162

163+
def test_pointer_set_contents(self):
164+
class Struct(Structure):
165+
_fields_ = [('a', c_int16)]
166+
p = pointer(Struct(a=23))
167+
self.assertEqual(p.contents.a, 23)
168+
self.assertIs(p._type_, Struct)
169+
cp = cast(p, POINTER(c_int16))
170+
self.assertEqual(cp.contents._type_, 'h')
171+
cp.contents = c_int16(24)
172+
self.assertEqual(cp.contents.value, 24)
173+
self.assertEqual(p.contents.a, 24)
174+
175+
pp = pointer(p)
176+
self.assertIs(pp._type_, POINTER(Struct))
177+
178+
from code import interact; interact(local=locals())
179+
180+
cast(pp, POINTER(POINTER(c_int16))).contents.contents = c_int16(32)
181+
182+
# self.assertIs(p.contents, pp.contents.contents)
183+
184+
self.assertEqual(cast(p, POINTER(c_int16)).contents.value, 32)
185+
self.assertEqual(p[0].a, 32) # works
186+
self.assertEqual(pp[0].contents.a, 32) # works
187+
self.assertEqual(pp.contents[0].a, 32) # works
188+
189+
self.assertEqual(p.contents.a, 32) # fails, wat, holds 23
190+
self.assertEqual(pp.contents.contents.a, 32) # fails, wat, holds 23
191+
163192

164193
if __name__ == "__main__":
165194
unittest.main()

Modules/_ctypes/_ctypes.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5172,11 +5172,15 @@ Pointer_get_contents(CDataObject *self, void *closure)
51725172
// It's not a cast: don't construct a new object,
51735173
// return existing one instead to preserve refcount
51745174
p2p = (CDataObject*) ptr2ptr;
5175+
printf("self->b_ptr=%lu\n", *(void**) self->b_ptr);
5176+
printf("p2p->b_ptr=%lu\n", *(void**) p2p->b_ptr);
5177+
printf("self->b_value.c=%lu\n", *(void**) self->b_value.c);
5178+
printf("p2p->b_value.c=%lu\n", *(void**) p2p->b_value.c);
51755179
assert(
5176-
*(void**) self->b_ptr == p2p->b_ptr ||
5177-
*(void**) self->b_value.c == p2p->b_ptr ||
5178-
*(void**) self->b_ptr == p2p->b_value.c ||
5179-
*(void**) self->b_value.c == p2p->b_value.c
5180+
*(void**) self->b_ptr == *(void**) p2p->b_ptr ||
5181+
*(void**) self->b_value.c == *(void**) p2p->b_ptr ||
5182+
*(void**) self->b_ptr == *(void**) p2p->b_value.c ||
5183+
*(void**) self->b_value.c == *(void**) p2p->b_value.c
51805184
); // double-check that we are returning the same thing
51815185
Py_INCREF(ptr2ptr);
51825186
return ptr2ptr;

0 commit comments

Comments
 (0)