changeset 345:baff3b90dcb1

__py_struct_from_dict__: new private compiled conversion function * __py_struct_from_dict__.cc: New private internal compiled function to convert a Python dict to a scalar struct. * Makefile.am (OCT_FILES): Add __py_struct_from_dict__.oct to the list.
author Mike Miller <mtmiller@octave.org>
date Tue, 16 Aug 2016 15:34:05 -0700
parents 9d95f087e5aa
children b1eff49bd139
files Makefile.am __py_struct_from_dict__.cc
diffstat 2 files changed, 86 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.am	Tue Aug 16 15:29:01 2016 -0700
+++ b/Makefile.am	Tue Aug 16 15:34:05 2016 -0700
@@ -40,6 +40,7 @@
   README.md
 
 OCT_FILES = \
+  __py_struct_from_dict__.oct \
   pycall.oct \
   pyeval.oct \
   pyexec.oct
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/__py_struct_from_dict__.cc	Tue Aug 16 15:34:05 2016 -0700
@@ -0,0 +1,85 @@
+/*
+
+Copyright (C) 2016 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
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <Python.h>
+#include <octave/oct.h>
+
+#define PYTAVE_DO_DECLARE_SYMBOL
+#include "arrayobjectdefs.h"
+#include "exceptions.h"
+#include "oct-py-types.h"
+#include "octave_to_python.h"
+
+DEFUN_DLD (__py_struct_from_dict__, args, nargout,
+           "-*- texinfo -*-\n\
+@deftypefn  {} {} __py_struct_from_dict__ (@var{dict})\n\
+Extract a scalar struct from the Python dict @var{dict}.\n\
+\n\
+This is a private internal function not intended for direct use.\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+  std::string id;
+
+  int nargin = args.length ();
+
+  if (nargin != 1)
+    {
+      print_usage ();
+      return retval;
+    }
+
+  if (! (args(0).is_object () && args(0).class_name () == "pyobject"))
+    error ("pyobject.struct: argument must be a Python object");
+
+  Py_Initialize ();
+
+  try
+    {
+      // FIXME: PyObject *obj = look up stored pyobject reference (args(0));
+      boost::python::object arg;
+      pytave::octvalue_to_pyobj (arg, args(0));
+      PyObject *obj = arg.ptr ();
+
+      retval(0) = pytave::extract_py_scalar_map (obj);
+    }
+  catch (pytave::object_convert_exception const &)
+    {
+      error ("pyobject.struct: error in return value type conversion");
+    }
+  catch (boost::python::error_already_set const &)
+    {
+      std::string message = pytave::fetch_exception_message ();
+      error ("pyobject.struct: %s", message.c_str ());
+    }
+
+  return retval;
+}
+
+/*
+## No test needed for internal helper function.
+%!assert (1)
+*/