diff __py_struct_from_dict__.cc @ 358:d41fc23d4b9f

pyobject.isa: New overload method to handle Python types (fixes issue #49) * __py_struct_from_dict__.cc (F__py_isinstance__): New function to check whether a pyobject is an instance of a named type. * @pyobject/pyobject.m (pyobject.isa): New method. Add %!tests.
author Mike Miller <mtmiller@octave.org>
date Tue, 23 Aug 2016 18:09:17 -0700
parents 6cd581661176
children b0677c492655
line wrap: on
line diff
--- a/__py_struct_from_dict__.cc	Tue Aug 23 17:37:08 2016 -0700
+++ b/__py_struct_from_dict__.cc	Tue Aug 23 18:09:17 2016 -0700
@@ -31,6 +31,7 @@
 #include "arrayobjectdefs.h"
 #include "exceptions.h"
 #include "oct-py-types.h"
+#include "oct-py-util.h"
 #include "octave_to_python.h"
 
 DEFUN_DLD (__py_int64_scalar_value__, args, nargout,
@@ -77,6 +78,62 @@
   return retval;
 }
 
+DEFUN_DLD (__py_isinstance__, args, nargout,
+           "-*- texinfo -*-\n\
+@deftypefn  {} {} __py_isinstance__ (@var{x})\n\
+Check whether the Python object @var{obj} is an instance of a Python type\n\
+specified by the string @var{type}.\n\
+\n\
+This is a private internal function not intended for direct use.\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+
+  int nargin = args.length ();
+  if (nargin != 2)
+    {
+      print_usage ();
+      return retval;
+    }
+
+  if (! (args(0).is_object () && args(0).class_name () == "pyobject"))
+    error ("pyobject.isa: OBJ must be a Python object");
+
+  if (! args(1).is_string ())
+    error ("pyobject.isa: TYPE must be a string naming a Python type (py.*)");
+
+  std::string typestr = args(1).string_value ();
+  if (! ((typestr.size () > 3) && (typestr.compare (0, 3, "py.") == 0)))
+    error ("pyobject.isa: TYPE must be a string naming a Python type (py.*)");
+
+  typestr = typestr.substr (3);
+
+  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 ();
+
+      PyObject *type = pytave::py_find_type (typestr);
+      retval(0) = pytave::py_isinstance (obj, type);
+      Py_XDECREF (type);
+    }
+  catch (pytave::object_convert_exception const &)
+    {
+      error ("pyobject.isa: error in return value type conversion");
+    }
+  catch (boost::python::error_already_set const &)
+    {
+      std::string message = pytave::fetch_exception_message ();
+      error ("pyobject.isa: %s", message.c_str ());
+    }
+
+  return retval;
+}
+
 DEFUN_DLD (__py_struct_from_dict__, args, nargout,
            "-*- texinfo -*-\n\
 @deftypefn  {} {} __py_struct_from_dict__ (@var{dict})\n\