# HG changeset patch # User Mike Miller # Date 1442754767 -7200 # Node ID 00d19f71c9ca18d9356f7cf8033288952ffce898 # Parent f6fec9453ac97e86cf4541a580258b0c446ea807 Initial implementation of py oct-file * py.cc: Initial implementation of py oct function. * ax_octave.m4: Find and export path to mkoctfile. * Makefile.am (.cc.oct): Custom rule to build py.oct. (all-am): Depend on py.oct. * .hgignore: Include py.oct in the ignore list. diff -r f6fec9453ac9 -r 00d19f71c9ca .hgignore --- a/.hgignore Sun Sep 20 02:57:31 2015 +0200 +++ b/.hgignore Sun Sep 20 15:12:47 2015 +0200 @@ -26,6 +26,7 @@ ^Makefile.in$ ^missing$ ^project-root.jam$ +^py\.oct$ ^_pytave?la*$ ^setup.py$ ^stamp-h1$ diff -r f6fec9453ac9 -r 00d19f71c9ca Makefile.am --- a/Makefile.am Sun Sep 20 02:57:31 2015 +0200 +++ b/Makefile.am Sun Sep 20 15:12:47 2015 +0200 @@ -14,3 +14,10 @@ _pytave_la_SOURCES = octave_to_python.cc pytave.cc python_to_octave.cc \ arrayobjectdefs.h octave_to_python.h pytavedefs.h exceptions.h \ exceptions.cc python_to_octave.h config.h + +all-am: py.oct + +.cc.oct: + $(MKOCTFILE) $(DEFS) $(_pytave_la_CPPFLAGS) $< exceptions.cc octave_to_python.cc python_to_octave.cc -l$(BOOST_PYTHON_LIB) $(PYTHON_LIBS) -o $@ + +SUFFIXES = .oct diff -r f6fec9453ac9 -r 00d19f71c9ca m4/ax_octave.m4 --- a/m4/ax_octave.m4 Sun Sep 20 02:57:31 2015 +0200 +++ b/m4/ax_octave.m4 Sun Sep 20 15:12:47 2015 +0200 @@ -80,6 +80,8 @@ ax_octave_config="[$]$1" ax_octave_ok= + AC_CHECK_TOOLS([MKOCTFILE], [mkoctfile]) + AC_MSG_CHECKING([for octave-config filename]) AS_IF([test -z "$ax_octave_config"], [ AC_MSG_RESULT([determined from path]) diff -r f6fec9453ac9 -r 00d19f71c9ca py.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/py.cc Sun Sep 20 15:12:47 2015 +0200 @@ -0,0 +1,116 @@ +/* + +Copyright (C) 2015 Mike Miller + +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 +. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +/* Both boost::python and octave define HAVE_STAT and HAVE_FSTAT. Ideally, + they shouldn't expose their configuration in the header files, but they do. + This silences the compiler warning. */ +#undef HAVE_STAT +#undef HAVE_FSTAT + +#include + +#define PYTAVE_DO_DECLARE_SYMBOL +#include "pytavedefs.h" +#include "arrayobjectdefs.h" +#include "exceptions.h" +#include "python_to_octave.h" + +using namespace boost::python; + +DEFUN_DLD (py, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} py (@var{func})\n\ +@enddeftypefn") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin != 1) + { + print_usage (); + return retval; + } + + 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); + } + + Py_Initialize (); + + try + { + object main_module = import ("__main__"); + object main_namespace = main_module.attr ("__dict__"); + + if (! module.empty ()) + { + std::string cmd = "import " + module; + exec (cmd.c_str (), main_namespace, main_namespace); + } + + object res = eval (func.c_str (), main_namespace, main_namespace); + + if (! res.is_none ()) + { + octave_value val; + pytave::pyobj_to_octvalue (val, res); + retval(0) = val; + } + } + catch (pytave::object_convert_exception const &) + { + error ("py: error in return value type conversion"); + } + catch (error_already_set const &) + { + std::cerr << "in here" << std::endl; + PyObject *ptype, *pvalue, *ptraceback; + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + try + { + std::string message = extract (pvalue); + error ("py: %s", message.c_str ()); + } + catch (error_already_set const &) + { + PyErr_Restore (ptype, pvalue, ptraceback); + PyErr_Print (); + } + } + + return retval; +} +