Commit 2e811c92 authored by Antoine Pitrou's avatar Antoine Pitrou

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.
........
parent 070f050c
...@@ -166,6 +166,42 @@ class SampleCallbacksTestCase(unittest.TestCase): ...@@ -166,6 +166,42 @@ class SampleCallbacksTestCase(unittest.TestCase):
self.assertLess(diff, 0.01, "%s not less than 0.01" % diff) 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__': if __name__ == '__main__':
......
...@@ -536,6 +536,7 @@ Luke Mewburn ...@@ -536,6 +536,7 @@ Luke Mewburn
Mike Meyer Mike Meyer
Steven Miale Steven Miale
Trent Mick Trent Mick
Stan Mihai
Aristotelis Mikropoulos Aristotelis Mikropoulos
Damien Miller Damien Miller
Chad Miller Chad Miller
......
...@@ -37,6 +37,9 @@ Core and Builtins ...@@ -37,6 +37,9 @@ Core and Builtins
Library 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, - Issue #11053: Fix IDLE "Syntax Error" windows to behave as in 2.x,
preventing a confusing hung appearance on OS X with the windows preventing a confusing hung appearance on OS X with the windows
obscured. obscured.
......
...@@ -12,6 +12,20 @@ ...@@ -12,6 +12,20 @@
/* some functions handy for testing */ /* 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]) EXPORT(void)testfunc_array(int values[4])
{ {
printf("testfunc_array %d %d %d %d\n", printf("testfunc_array %d %d %d %d\n",
......
...@@ -379,7 +379,7 @@ ffi_prep_closure (ffi_closure* closure, ...@@ -379,7 +379,7 @@ ffi_prep_closure (ffi_closure* closure,
short bytes; short bytes;
char *tramp; char *tramp;
#ifdef _WIN64 #ifdef _WIN64
int mask; int mask = 0;
#endif #endif
FFI_ASSERT (cif->abi == FFI_SYSV); FFI_ASSERT (cif->abi == FFI_SYSV);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment