Index: boost_1_63_0/libs/python/test/exec.cpp =================================================================== --- boost_1_63_0.orig/libs/python/test/exec.cpp +++ boost_1_63_0/libs/python/test/exec.cpp @@ -56,8 +56,24 @@ 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() { + PyCtx ctx; + // Retrieve the main module python::object main = python::import("__main__"); @@ -138,6 +154,19 @@ void check_pyerr(bool pyerr_expected=fal } } +template +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); @@ -156,29 +185,19 @@ int main(int argc, char **argv) "builtin modules"); } - // Initialize the interpreter - Py_Initialize(); - - if (python::handle_exception(eval_test)) { + // 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(); - } - else if(python::handle_exception(exec_test)) { - check_pyerr(); - } - else if (python::handle_exception(boost::bind(exec_file_test, script))) { - 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.