+import sys
import functools
import unittest
from test import support
gc.collect()
CFUNCTYPE(None)(lambda x=Nasty(): None)
+ @need_symbol('WINFUNCTYPE')
+ def test_i38748_stackCorruption(self):
+ callback_funcType = WINFUNCTYPE(c_long, c_long, c_longlong)
+ @callback_funcType
+ def callback(a, b):
+ c = a + b
+ print(f"a={a}, b={b}, c={c}")
+ return c
+ dll = cdll[_ctypes_test.__file__]
+ # With no fix for i38748, the next line will raise OSError and cause the test to fail.
+ self.assertEqual(dll._test_i38748_runCallback(callback, 5, 10), 15)
+
@need_symbol('WINFUNCTYPE')
class StdcallCallbacks(Callbacks):
#endif
+#ifdef MS_WIN32
+
+// i38748: c stub for testing stack corruption
+// When executing a Python callback with a long and a long long
+
+typedef long(__stdcall *_test_i38748_funcType)(long, long long);
+
+EXPORT(long) _test_i38748_runCallback(_test_i38748_funcType callback, int a, int b) {
+ return callback(a, b);
+}
+
+#endif
+
static struct PyModuleDef_Slot _ctypes_test_slots[] = {
{0, NULL}
};