r88285 - in python/branches/release31-maint: Lib/ctypes/test/test_callbacks.py Misc/ACKS Misc/NEWS Modules/_ctypes/_ctypes_test.c Modules/_ctypes/libffi_msvc/ffi.c

Author: antoine.pitrou Date: Mon Jan 31 22:36:33 2011 New Revision: 88285 Log: Merged revisions 88284 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r88284 | antoine.pitrou | 2011-01-31 22:08:57 +0100 (lun., 31 janv. 2011) | 4 lines Issue #8275: Fix passing of callback arguments with ctypes under Win64. Patch by Stan Mihai. Ok'ed by Georg. ........ Modified: python/branches/release31-maint/ (props changed) python/branches/release31-maint/Lib/ctypes/test/test_callbacks.py python/branches/release31-maint/Misc/ACKS python/branches/release31-maint/Misc/NEWS python/branches/release31-maint/Modules/_ctypes/_ctypes_test.c python/branches/release31-maint/Modules/_ctypes/libffi_msvc/ffi.c Modified: python/branches/release31-maint/Lib/ctypes/test/test_callbacks.py ============================================================================== --- python/branches/release31-maint/Lib/ctypes/test/test_callbacks.py (original) +++ python/branches/release31-maint/Lib/ctypes/test/test_callbacks.py Mon Jan 31 22:36:33 2011 @@ -166,6 +166,42 @@ self.assertLess(diff, 0.01, "%s not less than 0.01" % diff) + def test_callback_register_int(self): + # Issue #8275: buggy handling of callback args under Win64 + # NOTE: should be run on release builds as well + dll = CDLL(_ctypes_test.__file__) + CALLBACK = CFUNCTYPE(c_int, c_int, c_int, c_int, c_int, c_int) + # All this function does is call the callback with its args squared + func = dll._testfunc_cbk_reg_int + func.argtypes = (c_int, c_int, c_int, c_int, c_int, CALLBACK) + func.restype = c_int + + def callback(a, b, c, d, e): + return a + b + c + d + e + + result = func(2, 3, 4, 5, 6, CALLBACK(callback)) + self.assertEqual(result, callback(2*2, 3*3, 4*4, 5*5, 6*6)) + + def test_callback_register_double(self): + # Issue #8275: buggy handling of callback args under Win64 + # NOTE: should be run on release builds as well + dll = CDLL(_ctypes_test.__file__) + CALLBACK = CFUNCTYPE(c_double, c_double, c_double, c_double, + c_double, c_double) + # All this function does is call the callback with its args squared + func = dll._testfunc_cbk_reg_double + func.argtypes = (c_double, c_double, c_double, + c_double, c_double, CALLBACK) + func.restype = c_double + + def callback(a, b, c, d, e): + return a + b + c + d + e + + result = func(1.1, 2.2, 3.3, 4.4, 5.5, CALLBACK(callback)) + self.assertEqual(result, + callback(1.1*1.1, 2.2*2.2, 3.3*3.3, 4.4*4.4, 5.5*5.5)) + + ################################################################ if __name__ == '__main__': Modified: python/branches/release31-maint/Misc/ACKS ============================================================================== --- python/branches/release31-maint/Misc/ACKS (original) +++ python/branches/release31-maint/Misc/ACKS Mon Jan 31 22:36:33 2011 @@ -536,6 +536,7 @@ Mike Meyer Steven Miale Trent Mick +Stan Mihai Aristotelis Mikropoulos Damien Miller Chad Miller Modified: python/branches/release31-maint/Misc/NEWS ============================================================================== --- python/branches/release31-maint/Misc/NEWS (original) +++ python/branches/release31-maint/Misc/NEWS Mon Jan 31 22:36:33 2011 @@ -37,6 +37,9 @@ Library ------- +- Issue #8275: Fix passing of callback arguments with ctypes under Win64. + Patch by Stan Mihai. + - Issue #11053: Fix IDLE "Syntax Error" windows to behave as in 2.x, preventing a confusing hung appearance on OS X with the windows obscured. Modified: python/branches/release31-maint/Modules/_ctypes/_ctypes_test.c ============================================================================== --- python/branches/release31-maint/Modules/_ctypes/_ctypes_test.c (original) +++ python/branches/release31-maint/Modules/_ctypes/_ctypes_test.c Mon Jan 31 22:36:33 2011 @@ -12,6 +12,20 @@ /* some functions handy for testing */ +EXPORT(int) +_testfunc_cbk_reg_int(int a, int b, int c, int d, int e, + int (*func)(int, int, int, int, int)) +{ + return func(a*a, b*b, c*c, d*d, e*e); +} + +EXPORT(double) +_testfunc_cbk_reg_double(double a, double b, double c, double d, double e, + double (*func)(double, double, double, double, double)) +{ + return func(a*a, b*b, c*c, d*d, e*e); +} + EXPORT(void)testfunc_array(int values[4]) { printf("testfunc_array %d %d %d %d\n", Modified: python/branches/release31-maint/Modules/_ctypes/libffi_msvc/ffi.c ============================================================================== --- python/branches/release31-maint/Modules/_ctypes/libffi_msvc/ffi.c (original) +++ python/branches/release31-maint/Modules/_ctypes/libffi_msvc/ffi.c Mon Jan 31 22:36:33 2011 @@ -379,7 +379,7 @@ short bytes; char *tramp; #ifdef _WIN64 - int mask; + int mask = 0; #endif FFI_ASSERT (cif->abi == FFI_SYSV);
participants (1)
-
antoine.pitrou