summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorVinay Sajip <vinay_sajip@yahoo.co.uk>2016-08-05 20:24:27 (GMT)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>2016-08-05 20:24:27 (GMT)
commit6f25003291610fd7696aa09b725742a499d6b2cf (patch)
tree22c0152c8e156f2ea2e6df4dd331388be042083c /Lib
parentfb7929044af4a8560e0da8f88905f4617b9042f5 (diff)
downloadcpython-6f25003291610fd7696aa09b725742a499d6b2cf.zip
cpython-6f25003291610fd7696aa09b725742a499d6b2cf.tar.gz
cpython-6f25003291610fd7696aa09b725742a499d6b2cf.tar.bz2
Issue #20160: Handled passing of large structs to callbacks correctly.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/ctypes/test/test_callbacks.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py
index 5600b43..4ca50b8 100644
--- a/Lib/ctypes/test/test_callbacks.py
+++ b/Lib/ctypes/test/test_callbacks.py
@@ -1,3 +1,4 @@
+import functools
import unittest
from ctypes import *
import _ctypes_test
@@ -243,6 +244,40 @@ class SampleCallbacksTestCase(unittest.TestCase):
self.assertEqual(result,
callback(1.1*1.1, 2.2*2.2, 3.3*3.3, 4.4*4.4, 5.5*5.5))
+ def test_callback_large_struct(self):
+ class Check: pass
+
+ class X(Structure):
+ _fields_ = [
+ ('first', c_ulong),
+ ('second', c_ulong),
+ ('third', c_ulong),
+ ]
+
+ def callback(check, s):
+ check.first = s.first
+ check.second = s.second
+ check.third = s.third
+
+ check = Check()
+ s = X()
+ s.first = 0xdeadbeef
+ s.second = 0xcafebabe
+ s.third = 0x0bad1dea
+
+ CALLBACK = CFUNCTYPE(None, X)
+ dll = CDLL(_ctypes_test.__file__)
+ func = dll._testfunc_cbk_large_struct
+ func.argtypes = (X, CALLBACK)
+ func.restype = None
+ # the function just calls the callback with the passed structure
+ func(s, CALLBACK(functools.partial(callback, check)))
+ self.assertEqual(check.first, s.first)
+ self.assertEqual(check.second, s.second)
+ self.assertEqual(check.third, s.third)
+ self.assertEqual(check.first, 0xdeadbeef)
+ self.assertEqual(check.second, 0xcafebabe)
+ self.assertEqual(check.third, 0x0bad1dea)
################################################################