Author: Armin Rigo <ar...@tunes.org>
Branch: win32-stdcall
Changeset: r2318:3e58f08489fa
Date: 2015-10-06 12:22 +0200
http://bitbucket.org/cffi/cffi/changeset/3e58f08489fa/

Log:    Fix remaining tests

diff --git a/testing/cffi0/test_verify.py b/testing/cffi0/test_verify.py
--- a/testing/cffi0/test_verify.py
+++ b/testing/cffi0/test_verify.py
@@ -2250,7 +2250,7 @@
     """)
     lib = ffi.verify(r"""
         #ifndef _MSC_VER
-        #  define __stdcall FOOBARBAZZZZZ
+        #  define __stdcall  /* nothing */
         #endif
         int call1(int(*cb)(int)) {
             int i, result = 0;
diff --git a/testing/cffi1/test_recompiler.py b/testing/cffi1/test_recompiler.py
--- a/testing/cffi1/test_recompiler.py
+++ b/testing/cffi1/test_recompiler.py
@@ -1281,24 +1281,79 @@
     assert lib.aaa == 42
     py.test.raises(AttributeError, "lib.aaa = 43")
 
-def test_win32_calling_convention_1():
-    if sys.platform != 'win32':
-        py.test.skip("Windows only")
+def test_win32_calling_convention_0():
     ffi = FFI()
-    ffi.cdef("int call1(int(*cb)(int)); int cb1(int);", calling_conv="cdecl")
-    ffi.cdef("int call2(int(*cb)(int)); int cb2(int);", calling_conv="stdcall")
-    lib = verify(ffi, 'test_win32_calling_convention_1', r"""
-        int __cdecl cb1(int x) { return x * 2; }
-        int __cdecl call1(int(__cdecl *cb)(int)) {
-            printf("here1\n");
-            printf("cb = %p, cb1 = %p\n", cb, (void *)cb1);
+    ffi.cdef("""
+        int call1(int(__cdecl   *cb)(int));
+        int (*const call2)(int(__stdcall *cb)(int));
+    """)
+    lib = verify(ffi, 'test_win32_calling_convention_0', r"""
+        #ifndef _MSC_VER
+        #  define __stdcall  /* nothing */
+        #endif
+        int call1(int(*cb)(int)) {
             int i, result = 0;
+            printf("call1: cb = %p\n", cb);
             for (i = 0; i < 1000; i++)
                 result += cb(i);
             printf("result = %d\n", result);
             return result;
         }
+        int call2(int(__stdcall *cb)(int)) {
+            int i, result = 0;
+            printf("call2: cb = %p\n", cb);
+            for (i = 0; i < 1000; i++)
+                result += cb(-i);
+            printf("result = %d\n", result);
+            return result;
+        }
+    """)
+    @ffi.callback("int(int)")
+    def cb1(x):
+        return x * 2
+    @ffi.callback("int __stdcall(int)")
+    def cb2(x):
+        return x * 3
+    res = lib.call1(cb1)
+    assert res == 500*999*2
+    assert res == ffi.addressof(lib, 'call1')(cb1)
+    res = lib.call2(cb2)
+    assert res == -500*999*3
+    assert res == ffi.addressof(lib, 'call2')(cb2)
+    if sys.platform == 'win32':
+        assert '__stdcall' in str(ffi.typeof(cb2))
+        assert '__stdcall' not in str(ffi.typeof(cb1))
+        py.test.raises(TypeError, lib.call1, cb2)
+        py.test.raises(TypeError, lib.call2, cb1)
+    else:
+        assert '__stdcall' not in str(ffi.typeof(cb2))
+        assert ffi.typeof(cb2) is ffi.typeof(cb1)
+
+def test_win32_calling_convention_1():
+    ffi = FFI()
+    ffi.cdef("""
+        int __cdecl   call1(int(__cdecl   *cb)(int));
+        int __stdcall call2(int(__stdcall *cb)(int));
+        int (__cdecl   *const cb1)(int);
+        int (__stdcall *const cb2)(int);
+    """)
+    lib = verify(ffi, 'test_win32_calling_convention_1', r"""
+        #ifndef _MSC_VER
+        #  define __cdecl
+        #  define __stdcall
+        #endif
+        int __cdecl   cb1(int x) { return x * 2; }
         int __stdcall cb2(int x) { return x * 3; }
+
+        int __cdecl call1(int(__cdecl *cb)(int)) {
+            int i, result = 0;
+            printf("here1\n");
+            printf("cb = %p, cb1 = %p\n", cb, (void *)cb1);
+            for (i = 0; i < 1000; i++)
+                result += cb(i);
+            printf("result = %d\n", result);
+            return result;
+        }
         int __stdcall call2(int(__stdcall *cb)(int)) {
             int i, result = 0;
             printf("here1\n");
@@ -1320,55 +1375,68 @@
     print '<<< done'
 
 def test_win32_calling_convention_2():
-    if sys.platform != 'win32':
-        py.test.skip("Windows only")
     # any mistake in the declaration of plain function (including the
     # precise argument types and, here, the calling convention) are
     # automatically corrected.  But this does not apply to the 'cb'
     # function pointer argument.
     ffi = FFI()
-    ffi.cdef("int call1(int(*cb)(int)); int cb1(int);", calling_conv="cdecl")
-    ffi.cdef("int call2(int(*cb)(int)); int cb2(int);", calling_conv="stdcall")
+    ffi.cdef("""
+        int __stdcall call1(int(__cdecl   *cb)(int));
+        int __cdecl   call2(int(__stdcall *cb)(int));
+        int (__cdecl   *const cb1)(int);
+        int (__stdcall *const cb2)(int);
+    """)
     lib = verify(ffi, 'test_win32_calling_convention_2', """
-        int __stdcall call1(int(__cdecl *cb)(int)) {
+        #ifndef _MSC_VER
+        #  define __cdecl
+        #  define __stdcall
+        #endif
+        int __cdecl call1(int(__cdecl *cb)(int)) {
             int i, result = 0;
             for (i = 0; i < 1000; i++)
                 result += cb(i);
             return result;
         }
-        int __cdecl call2(int(__stdcall *cb)(int)) {
+        int __stdcall call2(int(__stdcall *cb)(int)) {
             int i, result = 0;
             for (i = 0; i < 1000; i++)
                 result += cb(-i);
             return result;
         }
-        int __stdcall cb1(int x) { return x * 2; }
-        int __cdecl cb2(int x) { return x * 3; }
+        int __cdecl   cb1(int x) { return x * 2; }
+        int __stdcall cb2(int x) { return x * 3; }
     """)
     ptr_call1 = ffi.addressof(lib, 'call1')
     ptr_call2 = ffi.addressof(lib, 'call2')
-    py.test.raises(TypeError, lib.call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, ptr_call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, lib.call2, ffi.addressof(lib, 'cb1'))
-    py.test.raises(TypeError, ptr_call2, ffi.addressof(lib, 'cb1'))
+    if sys.platform == 'win32':
+        py.test.raises(TypeError, lib.call1, ffi.addressof(lib, 'cb2'))
+        py.test.raises(TypeError, ptr_call1, ffi.addressof(lib, 'cb2'))
+        py.test.raises(TypeError, lib.call2, ffi.addressof(lib, 'cb1'))
+        py.test.raises(TypeError, ptr_call2, ffi.addressof(lib, 'cb1'))
     assert lib.call1(ffi.addressof(lib, 'cb1')) == 500*999*2
     assert ptr_call1(ffi.addressof(lib, 'cb1')) == 500*999*2
     assert lib.call2(ffi.addressof(lib, 'cb2')) == -500*999*3
     assert ptr_call2(ffi.addressof(lib, 'cb2')) == -500*999*3
 
 def test_win32_calling_convention_3():
-    if sys.platform != 'win32':
-        py.test.skip("Windows only")
     ffi = FFI()
-    ffi.cdef("struct point { int x, y; };")
-    ffi.cdef("struct point call1(int(*cb)(struct point)); "
-             "int cb1(struct point);", calling_conv="cdecl")
-    ffi.cdef("struct point call2(int(*cb)(struct point)); "
-             "int cb2(struct point);", calling_conv="stdcall")
+    ffi.cdef("""
+        struct point { int x, y; };
+
+        int (*const cb1)(struct point);
+        int (__stdcall *const cb2)(struct point);
+
+        struct point __stdcall call1(int(*cb)(struct point));
+        struct point call2(int(__stdcall *cb)(struct point));
+    """)
     lib = verify(ffi, 'test_win32_calling_convention_3', r"""
+        #ifndef _MSC_VER
+        #  define __cdecl
+        #  define __stdcall
+        #endif
         struct point { int x, y; };
-        int __stdcall cb1(struct point pt) { return pt.x + 10 * pt.y; }
-        int __cdecl cb2(struct point pt) { return pt.x + 100 * pt.y; }
+        int           cb1(struct point pt) { return pt.x + 10 * pt.y; }
+        int __stdcall cb2(struct point pt) { return pt.x + 100 * pt.y; }
         struct point __stdcall call1(int(__cdecl *cb)(struct point)) {
             int i;
             struct point result = { 0, 0 };
@@ -1396,11 +1464,11 @@
     """)
     ptr_call1 = ffi.addressof(lib, 'call1')
     ptr_call2 = ffi.addressof(lib, 'call2')
-    py.test.raises(TypeError, lib.call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, ptr_call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, lib.call2, ffi.addressof(lib, 'cb1'))
-    py.test.raises(TypeError, ptr_call2, ffi.addressof(lib, 'cb1'))
-    print '<<< cb1 =', ffi.addressof(lib, 'cb1')
+    if sys.platform == 'win32':
+        py.test.raises(TypeError, lib.call1, ffi.addressof(lib, 'cb2'))
+        py.test.raises(TypeError, ptr_call1, ffi.addressof(lib, 'cb2'))
+        py.test.raises(TypeError, lib.call2, ffi.addressof(lib, 'cb1'))
+        py.test.raises(TypeError, ptr_call2, ffi.addressof(lib, 'cb1'))
     pt = lib.call1(ffi.addressof(lib, 'cb1'))
     assert (pt.x, pt.y) == (-9*500*999, 9*500*999)
     pt = ptr_call1(ffi.addressof(lib, 'cb1'))
@@ -1409,43 +1477,3 @@
     assert (pt.x, pt.y) == (99*500*999, -99*500*999)
     pt = ptr_call2(ffi.addressof(lib, 'cb2'))
     assert (pt.x, pt.y) == (99*500*999, -99*500*999)
-
-def test_win32_calling_convention_4():
-    if sys.platform != 'win32':
-        py.test.skip("Windows only")
-    ffi = FFI()
-    ffi.cdef("int call1(int(*cb)(int));", calling_conv="cdecl")
-    ffi.cdef("int call2(int(*cb)(int));", calling_conv="stdcall")
-    lib = verify(ffi, 'test_win32_calling_convention_4', """
-        int __stdcall call1(int(__cdecl *cb)(int)) {
-            int i, result = 0;
-            for (i = 0; i < 1000; i++)
-                result += cb(i);
-            return result;
-        }
-        int __cdecl call2(int(__stdcall *cb)(int)) {
-            int i, result = 0;
-            for (i = 0; i < 1000; i++)
-                result += cb(-i);
-            return result;
-        }
-    """)
-    @ffi.callback("int(int)", calling_conv="cdecl")
-    def cb1(x):
-        return x * 2
-    ...
-    @ffi.callback("int(int)", calling_conv="stdcall")
-    def cb2(x):
-        return x * 2
-    
-    
-    ptr_call1 = ffi.addressof(lib, 'call1')
-    ptr_call2 = ffi.addressof(lib, 'call2')
-    py.test.raises(TypeError, lib.call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, ptr_call1, ffi.addressof(lib, 'cb2'))
-    py.test.raises(TypeError, lib.call2, ffi.addressof(lib, 'cb1'))
-    py.test.raises(TypeError, ptr_call2, ffi.addressof(lib, 'cb1'))
-    assert lib.call1(ffi.addressof(lib, 'cb1')) == 500*999*2
-    assert ptr_call1(ffi.addressof(lib, 'cb1')) == 500*999*2
-    assert lib.call2(ffi.addressof(lib, 'cb2')) == -500*999*3
-    assert ptr_call2(ffi.addressof(lib, 'cb2')) == -500*999*3
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to