calling_conventions.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. //
  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
  5. //
  6. // Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
  7. //
  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)
  11. //
  12. #if !defined(TEST_INCLUDE_RECURSION)
  13. #define TEST_INCLUDE_RECURSION
  14. //------------------------------------------------------------------------------
  15. // this section is the main body of the test extension module
  16. #if defined(_WIN32) && !defined(_WIN64)
  17. # define BOOST_PYTHON_ENABLE_CDECL
  18. # define BOOST_PYTHON_ENABLE_STDCALL
  19. # define BOOST_PYTHON_ENABLE_FASTCALL
  20. #endif
  21. #include <boost/preprocessor/cat.hpp>
  22. #include <boost/preprocessor/stringize.hpp>
  23. #include <boost/python.hpp>
  24. using namespace boost::python;
  25. // first define test functions for every calling convention
  26. #define TEST_DECLARE_FUNCTIONS
  27. #define TESTED_CALLING_CONVENTION __cdecl
  28. #include "calling_conventions.cpp"
  29. #undef TESTED_CALLING_CONVENTION
  30. #define TESTED_CALLING_CONVENTION __stdcall
  31. #include "calling_conventions.cpp"
  32. #undef TESTED_CALLING_CONVENTION
  33. #define TESTED_CALLING_CONVENTION __fastcall
  34. #include "calling_conventions.cpp"
  35. #undef TESTED_CALLING_CONVENTION
  36. #undef TEST_DECLARE_FUNCTIONS
  37. // then create a module wrapping the defined functions for every calling convention
  38. BOOST_PYTHON_MODULE( calling_conventions_ext )
  39. {
  40. #define TEST_WRAP_FUNCTIONS
  41. #define TESTED_CALLING_CONVENTION __cdecl
  42. #include "calling_conventions.cpp"
  43. #undef TESTED_CALLING_CONVENTION
  44. #define TESTED_CALLING_CONVENTION __stdcall
  45. #include "calling_conventions.cpp"
  46. #undef TESTED_CALLING_CONVENTION
  47. #define TESTED_CALLING_CONVENTION __fastcall
  48. #include "calling_conventions.cpp"
  49. #undef TESTED_CALLING_CONVENTION
  50. #undef TEST_WRAP_FUNCTIONS
  51. }
  52. #else // !defined(TEST_INCLUDE_RECURSION)
  53. //------------------------------------------------------------------------------
  54. // this section defines the functions to be wrapped
  55. # if defined(TEST_DECLARE_FUNCTIONS)
  56. # if !defined(TESTED_CALLING_CONVENTION)
  57. # error "One calling convention must be defined"
  58. # endif // !defined(TESTED_CALLING_CONVENTION)
  59. namespace BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION) {
  60. long TESTED_CALLING_CONVENTION f_0()
  61. {
  62. return 17041L;
  63. }
  64. long TESTED_CALLING_CONVENTION f_1(long a)
  65. {
  66. return a;
  67. }
  68. long TESTED_CALLING_CONVENTION f_2(long a, long b)
  69. {
  70. return a + 10 * b;
  71. }
  72. long TESTED_CALLING_CONVENTION f_3(long a, long b, long c)
  73. {
  74. return a + 10 * b + 100 * c;
  75. }
  76. long TESTED_CALLING_CONVENTION f_4(long a, long b, long c, long d)
  77. {
  78. return a + 10 * b + 100 * c + 1000 * d;
  79. }
  80. long TESTED_CALLING_CONVENTION f_5(long a, long b, long c, long d, long e)
  81. {
  82. return a + 10 * b + 100 * c + 1000 * d + 10000 * e;
  83. }
  84. long TESTED_CALLING_CONVENTION f_6(long a, long b, long c, long d, long e, long f)
  85. {
  86. return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f;
  87. }
  88. long TESTED_CALLING_CONVENTION f_7(long a, long b, long c, long d, long e, long f, long g)
  89. {
  90. return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g;
  91. }
  92. long TESTED_CALLING_CONVENTION f_8(long a, long b, long c, long d, long e, long f, long g, long h)
  93. {
  94. return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h;
  95. }
  96. long TESTED_CALLING_CONVENTION f_9(long a, long b, long c, long d, long e, long f, long g, long h, long i)
  97. {
  98. return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h + 100000000 * i;
  99. }
  100. } // namespace test##TESTED_CALLING_CONVENTION
  101. # endif // defined(TEST_DECLARE_FUNCTIONS)
  102. //------------------------------------------------------------------------------
  103. // this section wraps the functions
  104. # if defined(TEST_WRAP_FUNCTIONS)
  105. # if !defined(TESTED_CALLING_CONVENTION)
  106. # error "One calling convention must be defined"
  107. # endif // !defined(TESTED_CALLING_CONVENTION)
  108. def("f_0" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_0);
  109. def("f_1" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_1);
  110. def("f_2" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_2);
  111. def("f_3" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_3);
  112. def("f_4" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_4);
  113. def("f_5" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_5);
  114. def("f_6" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_6);
  115. def("f_7" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_7);
  116. def("f_8" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_8);
  117. def("f_9" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_9);
  118. # endif // defined(TEST_WRAP_FUNCTIONS)
  119. #endif // !defined(TEST_INCLUDE_RECURSION)