diff -aup boost_1_63_0/libs/python/test/exec.cpp.orig boost_1_63_0/libs/python/test/exec.cpp --- boost_1_63_0/libs/python/test/exec.cpp.orig 2017-01-02 05:05:18.000000000 -0500 +++ boost_1_63_0/libs/python/test/exec.cpp 2017-01-02 08:36:49.421564200 -0500 @@ -56,8 +56,23 @@ 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__"); @@ -137,6 +152,19 @@ "there was no exception handler registered."); } } + +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) { @@ -156,37 +184,27 @@ "builtin modules"); } - // 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))) { - check_pyerr(); - } - - if (python::handle_exception(exec_test_error)) - { + // 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(/*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