| diff -up boost_1_55_0/libs/python/test/exec.cpp\~ boost_1_55_0/libs/python/test/exec.cpp |
| --- boost_1_55_0/libs/python/test/exec.cpp~ 2010-07-05 00:38:38.000000000 +0200 |
| +++ boost_1_55_0/libs/python/test/exec.cpp 2015-01-09 21:31:12.903218280 +0100 |
| @@ -56,6 +56,20 @@ void eval_test() |
| BOOST_TEST(value == "ABCDEFG"); |
| } |
| |
| +struct PyCtx |
| +{ |
| + PyCtx() { |
| + Py_Initialize(); |
| + } |
| + |
| + ~PyCtx() { |
| + // N.B. certain problems may arise when Py_Finalize is called when |
| + // using Boost.Python. However in this test suite it all seems to |
| + // work fine. |
| + Py_Finalize(); |
| + } |
| +}; |
| + |
| void exec_test() |
| { |
| // Register the module with the interpreter |
| @@ -68,6 +82,8 @@ void exec_test() |
| ) == -1) |
| throw std::runtime_error("Failed to add embedded_hello to the interpreter's " |
| "builtin modules"); |
| + |
| + PyCtx ctx; |
| // Retrieve the main module |
| python::object main = python::import("__main__"); |
| |
| @@ -148,41 +164,43 @@ void check_pyerr(bool pyerr_expected=fal |
| } |
| } |
| |
| +template <class Cb> |
| +bool |
| +run_and_handle_exception(Cb cb, bool pyerr_expected = false) |
| +{ |
| + PyCtx ctx; |
| + if (python::handle_exception(cb)) { |
| + check_pyerr(pyerr_expected); |
| + return true; |
| + } else { |
| + return false; |
| + } |
| +} |
| + |
| int main(int argc, char **argv) |
| { |
| BOOST_TEST(argc == 2 || argc == 3); |
| std::string script = argv[1]; |
| - // Initialize the interpreter |
| - Py_Initialize(); |
| |
| - if (python::handle_exception(eval_test)) { |
| - check_pyerr(); |
| - } |
| - else if(python::handle_exception(exec_test)) { |
| - check_pyerr(); |
| - } |
| - else if (python::handle_exception(boost::bind(exec_file_test, script))) { |
| + // N.B. exec_test mustn't be called through run_and_handle_exception |
| + // as it needs to handles the python context by itself. |
| + if (run_and_handle_exception(eval_test) |
| + || python::handle_exception(exec_test)) |
| check_pyerr(); |
| - } |
| - |
| - if (python::handle_exception(exec_test_error)) |
| - { |
| - check_pyerr(/*pyerr_expected*/ true); |
| - } |
| else |
| - { |
| + run_and_handle_exception(boost::bind(exec_file_test, script)); |
| + |
| + if (!run_and_handle_exception(exec_test_error, true)) |
| BOOST_ERROR("Python exception expected, but not seen."); |
| - } |
| |
| if (argc > 2) { |
| + PyCtx ctx; |
| // The main purpose is to test compilation. Since this test generates |
| // a file and I (rwgk) am uncertain about the side-effects, run it only |
| // if explicitly requested. |
| exercise_embedding_html(); |
| } |
| |
| - // Boost.Python doesn't support Py_Finalize yet. |
| - // Py_Finalize(); |
| return boost::report_errors(); |
| } |
| |
| |
| Diff finished. Fri Jan 9 21:31:13 2015 |