2 // adapted from bind_stdcall_test.cpp - test for bind.hpp + __stdcall (free functions)
3 // The purpose of this simple test is to determine if a function can be
4 // called from Python with the various existing calling conventions
6 // Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
8 // Distributed under the Boost Software License, Version 1.0. (See
9 // accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
13 #if !defined(TEST_INCLUDE_RECURSION)
15 #define TEST_INCLUDE_RECURSION
17 //------------------------------------------------------------------------------
18 // this section is the main body of the test extension module
20 #if defined(_WIN32) && !defined(_WIN64)
21 # define BOOST_PYTHON_ENABLE_CDECL
22 # define BOOST_PYTHON_ENABLE_STDCALL
23 # define BOOST_PYTHON_ENABLE_FASTCALL
25 #include <boost/preprocessor/cat.hpp>
26 #include <boost/preprocessor/stringize.hpp>
27 #include <boost/python.hpp>
28 using namespace boost::python
;
30 // first define test functions for every calling convention
32 #define TEST_DECLARE_FUNCTIONS
34 #define TESTED_CALLING_CONVENTION __cdecl
35 #include "calling_conventions.cpp"
36 #undef TESTED_CALLING_CONVENTION
38 #define TESTED_CALLING_CONVENTION __stdcall
39 #include "calling_conventions.cpp"
40 #undef TESTED_CALLING_CONVENTION
42 #define TESTED_CALLING_CONVENTION __fastcall
43 #include "calling_conventions.cpp"
44 #undef TESTED_CALLING_CONVENTION
46 #undef TEST_DECLARE_FUNCTIONS
48 // then create a module wrapping the defined functions for every calling convention
50 BOOST_PYTHON_MODULE( calling_conventions_ext
)
53 #define TEST_WRAP_FUNCTIONS
55 #define TESTED_CALLING_CONVENTION __cdecl
56 #include "calling_conventions.cpp"
57 #undef TESTED_CALLING_CONVENTION
59 #define TESTED_CALLING_CONVENTION __stdcall
60 #include "calling_conventions.cpp"
61 #undef TESTED_CALLING_CONVENTION
63 #define TESTED_CALLING_CONVENTION __fastcall
64 #include "calling_conventions.cpp"
65 #undef TESTED_CALLING_CONVENTION
67 #undef TEST_WRAP_FUNCTIONS
71 #else // !defined(TEST_INCLUDE_RECURSION)
73 //------------------------------------------------------------------------------
74 // this section defines the functions to be wrapped
76 # if defined(TEST_DECLARE_FUNCTIONS)
78 # if !defined(TESTED_CALLING_CONVENTION)
79 # error "One calling convention must be defined"
80 # endif // !defined(TESTED_CALLING_CONVENTION)
82 namespace BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
) {
84 long TESTED_CALLING_CONVENTION
f_0()
89 long TESTED_CALLING_CONVENTION
f_1(long a
)
94 long TESTED_CALLING_CONVENTION
f_2(long a
, long b
)
99 long TESTED_CALLING_CONVENTION
f_3(long a
, long b
, long c
)
101 return a
+ 10 * b
+ 100 * c
;
104 long TESTED_CALLING_CONVENTION
f_4(long a
, long b
, long c
, long d
)
106 return a
+ 10 * b
+ 100 * c
+ 1000 * d
;
109 long TESTED_CALLING_CONVENTION
f_5(long a
, long b
, long c
, long d
, long e
)
111 return a
+ 10 * b
+ 100 * c
+ 1000 * d
+ 10000 * e
;
114 long TESTED_CALLING_CONVENTION
f_6(long a
, long b
, long c
, long d
, long e
, long f
)
116 return a
+ 10 * b
+ 100 * c
+ 1000 * d
+ 10000 * e
+ 100000 * f
;
119 long TESTED_CALLING_CONVENTION
f_7(long a
, long b
, long c
, long d
, long e
, long f
, long g
)
121 return a
+ 10 * b
+ 100 * c
+ 1000 * d
+ 10000 * e
+ 100000 * f
+ 1000000 * g
;
124 long TESTED_CALLING_CONVENTION
f_8(long a
, long b
, long c
, long d
, long e
, long f
, long g
, long h
)
126 return a
+ 10 * b
+ 100 * c
+ 1000 * d
+ 10000 * e
+ 100000 * f
+ 1000000 * g
+ 10000000 * h
;
129 long TESTED_CALLING_CONVENTION
f_9(long a
, long b
, long c
, long d
, long e
, long f
, long g
, long h
, long i
)
131 return a
+ 10 * b
+ 100 * c
+ 1000 * d
+ 10000 * e
+ 100000 * f
+ 1000000 * g
+ 10000000 * h
+ 100000000 * i
;
134 } // namespace test##TESTED_CALLING_CONVENTION
136 # endif // defined(TEST_DECLARE_FUNCTIONS)
138 //------------------------------------------------------------------------------
139 // this section wraps the functions
141 # if defined(TEST_WRAP_FUNCTIONS)
143 # if !defined(TESTED_CALLING_CONVENTION)
144 # error "One calling convention must be defined"
145 # endif // !defined(TESTED_CALLING_CONVENTION)
147 def("f_0" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_0
);
148 def("f_1" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_1
);
149 def("f_2" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_2
);
150 def("f_3" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_3
);
151 def("f_4" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_4
);
152 def("f_5" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_5
);
153 def("f_6" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_6
);
154 def("f_7" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_7
);
155 def("f_8" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_8
);
156 def("f_9" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION
), &BOOST_PP_CAT(test
, TESTED_CALLING_CONVENTION
)::f_9
);
158 # endif // defined(TEST_WRAP_FUNCTIONS)
160 #endif // !defined(TEST_INCLUDE_RECURSION)