Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r55639 - in trunk/libs/python: src test
From: rwgk_at_[hidden]
Date: 2009-08-17 20:24:55


Author: rwgk
Date: 2009-08-17 20:24:54 EDT (Mon, 17 Aug 2009)
New Revision: 55639
URL: http://svn.boost.org/trac/boost/changeset/55639

Log:
libs/python/src/exec.cpp: bug fixes
Remark:
  operator!() for boost::python::object invokes PyObject_IsTrue()
  and is therefore not equivalent to "is None".
  In this particular case !global or !local returns true for an
  empty dict.
(Changes to libs/python/test/exec.cpp just helped in debugging.)

Text files modified:
   trunk/libs/python/src/exec.cpp | 20 +++++++++------
   trunk/libs/python/test/exec.cpp | 53 +++++++++++++++++++++------------------
   2 files changed, 41 insertions(+), 32 deletions(-)

Modified: trunk/libs/python/src/exec.cpp
==============================================================================
--- trunk/libs/python/src/exec.cpp (original)
+++ trunk/libs/python/src/exec.cpp 2009-08-17 20:24:54 EDT (Mon, 17 Aug 2009)
@@ -17,14 +17,15 @@
 object BOOST_PYTHON_DECL eval(str string, object global, object local)
 {
   // Set suitable default values for global and local dicts.
- if (!global)
+ object none;
+ if (global.ptr() == none.ptr())
   {
     if (PyObject *g = PyEval_GetGlobals())
       global = object(detail::borrowed_reference(g));
     else
       global = dict();
   }
- if (!local) local = global;
+ if (local.ptr() == none.ptr()) local = global;
   // should be 'char const *' but older python versions don't use 'const' yet.
   char *s = python::extract<char *>(string);
   PyObject* result = PyRun_String(s, Py_eval_input, global.ptr(), local.ptr());
@@ -35,14 +36,15 @@
 object BOOST_PYTHON_DECL exec(str string, object global, object local)
 {
   // Set suitable default values for global and local dicts.
- if (!global)
+ object none;
+ if (global.ptr() == none.ptr())
   {
     if (PyObject *g = PyEval_GetGlobals())
       global = object(detail::borrowed_reference(g));
     else
       global = dict();
   }
- if (!local) local = global;
+ if (local.ptr() == none.ptr()) local = global;
   // should be 'char const *' but older python versions don't use 'const' yet.
   char *s = python::extract<char *>(string);
   PyObject* result = PyRun_String(s, Py_file_input, global.ptr(), local.ptr());
@@ -53,14 +55,15 @@
 object BOOST_PYTHON_DECL exec_statement(str string, object global, object local)
 {
   // Set suitable default values for global and local dicts.
- if (!global)
+ object none;
+ if (global.ptr() == none.ptr())
   {
     if (PyObject *g = PyEval_GetGlobals())
       global = object(detail::borrowed_reference(g));
     else
       global = dict();
   }
- if (!local) local = global;
+ if (local.ptr() == none.ptr()) local = global;
   // should be 'char const *' but older python versions don't use 'const' yet.
   char *s = python::extract<char *>(string);
   PyObject* result = PyRun_String(s, Py_single_input, global.ptr(), local.ptr());
@@ -74,14 +77,15 @@
 object BOOST_PYTHON_DECL exec_file(str filename, object global, object local)
 {
   // Set suitable default values for global and local dicts.
- if (!global)
+ object none;
+ if (global.ptr() == none.ptr())
   {
     if (PyObject *g = PyEval_GetGlobals())
       global = object(detail::borrowed_reference(g));
     else
       global = dict();
   }
- if (!local) local = global;
+ if (local.ptr() == none.ptr()) local = global;
   // should be 'char const *' but older python versions don't use 'const' yet.
   char *f = python::extract<char *>(filename);
   // Let python open the file to avoid potential binary incompatibilities.

Modified: trunk/libs/python/test/exec.cpp
==============================================================================
--- trunk/libs/python/test/exec.cpp (original)
+++ trunk/libs/python/test/exec.cpp 2009-08-17 20:24:54 EDT (Mon, 17 Aug 2009)
@@ -108,6 +108,25 @@
   python::object result = python::exec("print unknown \n", global, global);
 }
 
+void check_pyerr(bool pyerr_expected=false)
+{
+ if (PyErr_Occurred())
+ {
+ if (!pyerr_expected) {
+ BOOST_ERROR("Python Error detected");
+ PyErr_Print();
+ }
+ else {
+ PyErr_Clear();
+ }
+ }
+ else
+ {
+ BOOST_ERROR("A C++ exception was thrown for which "
+ "there was no exception handler registered.");
+ }
+}
+
 int main(int argc, char **argv)
 {
   BOOST_TEST(argc == 2);
@@ -115,37 +134,23 @@
   // Initialize the interpreter
   Py_Initialize();
 
- if (python::handle_exception(eval_test) ||
- python::handle_exception(exec_test) ||
- python::handle_exception(boost::bind(exec_file_test, script)))
- {
- if (PyErr_Occurred())
- {
- BOOST_ERROR("Python Error detected");
- PyErr_Print();
- }
- else
- {
- BOOST_ERROR("A C++ exception was thrown for which "
- "there was no exception handler registered.");
- }
+ 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))
   {
- if (PyErr_Occurred())
- {
- PyErr_Print();
- }
- else
- {
- BOOST_ERROR("A C++ exception was thrown for which "
- "there was no exception handler registered.");
- }
+ check_pyerr(/*pyerr_expected*/ true);
   }
   else
   {
- BOOST_ERROR("Python exception expected, but not seen.");
+ BOOST_ERROR("Python exception expected, but not seen.");
   }
   
   // Boost.Python doesn't support Py_Finalize yet.


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk