# HG changeset patch # User Abhinav Tripathi # Date 1470767258 25200 # Node ID 2ecae5c6eeb69cf1979a5baacacf09552467b358 # Parent 510ed59a61d3564353fc8b91b610ce166b39eb02 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 diff -r 510ed59a61d3 -r 2ecae5c6eeb6 Makefile.am --- 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 \ diff -r 510ed59a61d3 -r 2ecae5c6eeb6 pycall.cc --- 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 pyargs; for (int i = 1; i < nargin; i++) diff -r 510ed59a61d3 -r 2ecae5c6eeb6 pytave_utils.cc --- /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 +. + +*/ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#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]; + } + } +} diff -r 510ed59a61d3 -r 2ecae5c6eeb6 pytave_utils.h --- /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 +. + +*/ + +#if ! defined (pytave_utils_h) +#define pytave_utils_h + +#include + +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 diff -r 510ed59a61d3 -r 2ecae5c6eeb6 python_to_octave.cc --- 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));