changeset 306:2ecae5c6eeb6

Refactor code, have common functions in pytave_utils * pytave_utils.{h,cc}: Have the 2 functions to get builtins module and an object from python as utils. * Makefile.am: Add pytave_utils{h,cc} to the build process. * pycall.cc: Use pytave_utils to get FUNC from python and remove unused code. * python_to_octave.cc: Use pytave_utils to get the builtins module
author Abhinav Tripathi <genuinelucifer@gmail.com>
date Tue, 09 Aug 2016 11:27:38 -0700
parents 510ed59a61d3
children b4e56f7255f7
files Makefile.am pycall.cc pytave_utils.cc pytave_utils.h python_to_octave.cc
diffstat 5 files changed, 140 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.am	Wed Aug 03 16:23:09 2016 -0700
+++ b/Makefile.am	Tue Aug 09 11:27:38 2016 -0700
@@ -27,7 +27,8 @@
 COMMON_SOURCE_FILES = \
   exceptions.cc \
   octave_to_python.cc \
-  python_to_octave.cc
+  python_to_octave.cc \
+  pytave_utils.cc
 
 DOC_FILES = \
   INSTALL.md \
@@ -45,7 +46,8 @@
   config.h \
   exceptions.h \
   octave_to_python.h \
-  python_to_octave.h
+  python_to_octave.h \
+  pytave_utils.h
 
 PY_FILES = \
   package/__init__.py \
--- a/pycall.cc	Wed Aug 03 16:23:09 2016 -0700
+++ b/pycall.cc	Tue Aug 09 11:27:38 2016 -0700
@@ -35,6 +35,7 @@
 #include "exceptions.h"
 #include "octave_to_python.h"
 #include "python_to_octave.h"
+#include "pytave_utils.h"
 
 using namespace boost::python;
 
@@ -88,64 +89,18 @@
       return retval;
     }
 
-  bool func_by_name = false;
-
-  if (args(0).is_string ())
-    func_by_name = true;
-  else if (args(0).is_object () && args(0).class_name () == "pyobject")
-    func_by_name = false;
-  else
-    error ("pycall: FUNC must be a string or a Python reference");
-
   Py_Initialize ();
 
   pytave::init_exceptions ();
   numeric::array::set_module_and_type ("numpy", "ndarray");
   _import_array ();
 
-  object main_module = import ("__main__");
-  object main_namespace = main_module.attr ("__dict__");
-#if PY_VERSION_HEX >= 0x03000000
-  object builtins_module = import ("builtins");
-#else
-  object builtins_module = import ("__builtin__");
-#endif
-
   try
     {
       object callable;
-
-      if (func_by_name)
-        {
-          std::string module;
-          std::string func = args(0).string_value ();
-
-          size_t idx = func.rfind (".");
-          if (idx != std::string::npos)
-            {
-              module = func.substr (0, idx);
-              func = func.substr (idx + 1);
-            }
-
-          object mod;
-          if (module.empty ())
-            {
-              if (PyObject_HasAttrString (main_module.ptr (), func.c_str ()))
-                mod = main_module;
-              else
-                mod = builtins_module;
-            }
-          else
-            mod = import (module.c_str ());
-
-          callable = mod.attr (func.c_str ());
-        }
-      else
-        {
-          octave_value_list tmp = feval ("getid", ovl (args(0)), 1);
-          std::string hexid = tmp(0).string_value ();
-          callable = main_module.attr ("__InOct__")[hexid];
-        }
+      pytave::get_object_from_python (args(0), callable);
+      if (callable.is_none ())
+        error("pycall: FUNC must be a string or a Python reference");
 
       std::vector<object> pyargs;
       for (int i = 1; i < nargin; i++)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pytave_utils.cc	Tue Aug 09 11:27:38 2016 -0700
@@ -0,0 +1,94 @@
+/*
+
+Copyright (C) 2016 Abhinav Tripathi
+
+This file is part of Pytave.
+
+Pytave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Pytave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Pytave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <oct.h>
+#include <octave/parse.h>
+
+#include "pytave_utils.h"
+
+using namespace boost::python;
+
+namespace pytave
+{
+  void get_builtins_module (boost::python::object& builtins_module)
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    builtins_module = import ("builtins");
+#else
+    builtins_module = import ("__builtin__");
+#endif
+  }
+
+  void get_object_from_python (const octave_value& oct_value,
+                               boost::python::object& py_object)
+  {
+    bool by_name;
+    if (oct_value.is_string ())
+      by_name = true;
+    else if (oct_value.is_object () && oct_value.class_name () == "pyobject")
+      by_name = false;
+    else
+      {
+        py_object = boost::python::object();      //None
+        return;
+      }
+
+    object main_module = import ("__main__");
+    object builtins_module;
+    get_builtins_module (builtins_module);
+
+    if (by_name)
+      {
+        std::string module;
+        std::string func = oct_value.string_value ();
+
+        size_t idx = func.rfind (".");
+        if (idx != std::string::npos)
+          {
+            module = func.substr (0, idx);
+            func = func.substr (idx + 1);
+          }
+
+        object mod;
+        if (module.empty ())
+          {
+            if (PyObject_HasAttrString (main_module.ptr (), func.c_str ()))
+              mod = main_module;
+            else
+              mod = builtins_module;
+          }
+        else
+          mod = import (module.c_str ());
+        py_object = mod.attr (func.c_str ());
+      }
+    else
+      {
+        octave_value_list tmp = feval ("getid", ovl (oct_value), 1);
+        std::string hexid = tmp(0).string_value ();
+        py_object = main_module.attr ("__InOct__")[hexid];
+      }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pytave_utils.h	Tue Aug 09 11:27:38 2016 -0700
@@ -0,0 +1,35 @@
+/*
+
+Copyright (C) 2016 Abhinav Tripathi
+
+This file is part of Pytave.
+
+Pytave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Pytave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Pytave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if ! defined (pytave_utils_h)
+#define pytave_utils_h
+
+#include <boost/python.hpp>
+
+namespace pytave
+{
+  void get_builtins_module (boost::python::object& builtins_module);
+  void get_object_from_python (const octave_value& oct_value,
+                               boost::python::object& py_object);
+}
+
+#endif
--- a/python_to_octave.cc	Wed Aug 03 16:23:09 2016 -0700
+++ b/python_to_octave.cc	Tue Aug 09 11:27:38 2016 -0700
@@ -41,6 +41,7 @@
 #include "arrayobjectdefs.h"
 #include "exceptions.h"
 #include "python_to_octave.h"
+#include "pytave_utils.h"
 
 using namespace boost::python;
 
@@ -481,11 +482,8 @@
   {
     object main_module = import ("__main__");
     object main_namespace = main_module.attr ("__dict__");
-#if PY_VERSION_HEX >= 0x03000000
-    object builtins_module = import ("builtins");
-#else
-    object builtins_module = import ("__builtin__");
-#endif
+    object builtins_module;
+    pytave::get_builtins_module (builtins_module);
     object hex_function = builtins_module.attr ("hex");
     object id_function = builtins_module.attr ("id");
     object idtmp = hex_function (id_function (py_object));