diff __py_struct_from_dict__.cc @ 374:d362cdd1ddeb

pyobject: add conversion methods for single, intX, and uintX types * oct-py-types.cc, oct-py-types.h (pytave::extract_py_uint64): New function. * __py_struct_from_dict__.cc (F__py_uint64_scalar_value__): New function. (F__py_int64_scalar_value__): Simplify and clean up style. Add %!tests. * @pyobject/pyobject.m (pyobject.single, pyobject.int8, pyobject.int16, pyobject.int32, pyobject.uint8, pyobject.uint16, pyobject.uint32, pyobject.uint64): New conversion methods.
author Mike Miller <mtmiller@octave.org>
date Fri, 26 Aug 2016 18:51:42 -0700
parents 0e4097c66788
children d0a7f66393fc
line wrap: on
line diff
--- a/__py_struct_from_dict__.cc	Fri Aug 26 14:05:37 2016 -0700
+++ b/__py_struct_from_dict__.cc	Fri Aug 26 18:51:42 2016 -0700
@@ -71,48 +71,109 @@
 
 DEFUN_DLD (__py_int64_scalar_value__, args, nargout,
            "-*- texinfo -*-\n\
-@deftypefn  {} {} __py_int64_scalar_value__ (@var{x})\n\
+@deftypefn {} {} __py_int64_scalar_value__ (@var{x})\n\
 Extract a scalar int64 value from the Python integer @var{x}.\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 != 1)
-    {
-      print_usage ();
-      return retval;
-    }
+  if (args.length () != 1)
+    print_usage ();
 
   if (! (args(0).is_object () && args(0).class_name () == "pyobject"))
     error ("pyobject.int64: argument must be a Python object");
 
   Py_Initialize ();
 
+  PyObject *obj = pytave::pyobject_unwrap_object (args(0));
+  if (! obj)
+    error ("pyobject.int64: argument must be a valid Python object");
+
+  octave_int64 retval;
+
   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) = octave_int64 (pytave::extract_py_int64 (obj));
+      retval = pytave::extract_py_int64 (obj);
     }
   catch (pytave::object_convert_exception const &)
     {
-      error ("pyobject.int64: error in return value type conversion");
+      error ("pyobject.int64: argument must be a Python int or long object");
     }
   catch (boost::python::error_already_set const &)
     {
       std::string message = pytave::fetch_exception_message ();
       error ("pyobject.int64: %s", message.c_str ());
     }
+  Py_DECREF (obj);
 
-  return retval;
+  return ovl (retval);
 }
 
+/*
+%!assert (__py_int64_scalar_value__ (pyobject (pyeval ("0"))), int64 (0))
+%!assert (__py_int64_scalar_value__ (pyobject (pyeval ("2**62"))), int64 (2^62))
+%!assert (__py_int64_scalar_value__ (pyobject (pyeval ("-2**62"))), int64 (-2^62))
+%!assert (__py_int64_scalar_value__ (pyobject (pyeval ("2**128"))), intmax ("int64"))
+%!assert (__py_int64_scalar_value__ (pyobject (pyeval ("-2**128"))), intmin ("int64"))
+
+%!error __py_int64_scalar_value__ ()
+%!error __py_int64_scalar_value__ (1)
+%!error __py_int64_scalar_value__ (pyeval ("None"))
+%!error __py_int64_scalar_value__ (1, 2)
+*/
+
+DEFUN_DLD (__py_uint64_scalar_value__, args, nargout,
+           "-*- texinfo -*-\n\
+@deftypefn {} {} __py_uint64_scalar_value__ (@var{x})\n\
+Extract a scalar uint64 value from the Python integer @var{x}.\n\
+\n\
+This is a private internal function not intended for direct use.\n\
+@end deftypefn")
+{
+  if (args.length () != 1)
+    print_usage ();
+
+  if (! (args(0).is_object () && args(0).class_name () == "pyobject"))
+    error ("pyobject.uint64: argument must be a Python object");
+
+  Py_Initialize ();
+
+  PyObject *obj = pytave::pyobject_unwrap_object (args(0));
+  if (! obj)
+    error ("pyobject.uint64: argument must be a valid Python object");
+
+  octave_uint64 retval;
+
+  try
+    {
+      retval = pytave::extract_py_uint64 (obj);
+    }
+  catch (pytave::object_convert_exception const &)
+    {
+      error ("pyobject.uint64: argument must be a Python int or long object");
+    }
+  catch (boost::python::error_already_set const &)
+    {
+      std::string message = pytave::fetch_exception_message ();
+      error ("pyobject.uint64: %s", message.c_str ());
+    }
+  Py_DECREF (obj);
+
+  return ovl (retval);
+}
+
+/*
+%!assert (__py_uint64_scalar_value__ (pyobject (pyeval ("0"))), uint64 (0))
+%!assert (__py_uint64_scalar_value__ (pyobject (pyeval ("2**62"))), uint64 (2^62))
+%!assert (__py_uint64_scalar_value__ (pyobject (pyeval ("2**128"))), intmax ("uint64"))
+%!assert (__py_uint64_scalar_value__ (pyobject (pyeval ("-2**128"))), intmin ("uint64"))
+
+%!error __py_uint64_scalar_value__ ()
+%!error __py_uint64_scalar_value__ (1)
+%!error __py_uint64_scalar_value__ (pyeval ("None"))
+%!error __py_uint64_scalar_value__ (1, 2)
+*/
+
 DEFUN_DLD (__py_is_none__, args, nargout,
            "-*- texinfo -*-\n\
 @deftypefn  {} {} __py_is_none__ (@var{x})\n\