[Numpy-svn] r3233 - in trunk/numpy/core: include/numpy src

numpy-svn at scipy.org numpy-svn at scipy.org
Thu Sep 28 12:46:26 CDT 2006


Author: oliphant
Date: 2006-09-28 12:46:22 -0500 (Thu, 28 Sep 2006)
New Revision: 3233

Modified:
   trunk/numpy/core/include/numpy/ndarrayobject.h
   trunk/numpy/core/src/arrayobject.c
Log:
Create PyArray_HasArrayInterface macro to simplify getting an array from the array interface.

Modified: trunk/numpy/core/include/numpy/ndarrayobject.h
===================================================================
--- trunk/numpy/core/include/numpy/ndarrayobject.h	2006-09-28 16:22:43 UTC (rev 3232)
+++ trunk/numpy/core/include/numpy/ndarrayobject.h	2006-09-28 17:46:22 UTC (rev 3233)
@@ -1416,6 +1416,13 @@
 #define PyArray_Check(op) ((op)->ob_type == &PyArray_Type ||            \
                            PyObject_TypeCheck((op), &PyArray_Type))
 #define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)
+#define PyArray_HasArrayInterfaceType(op, type, context, out)              \
+        ((((out)=PyArray_FromStructInterface(op)) != Py_NotImplemented) || \
+         (((out)=PyArray_FromInterface(op)) != Py_NotImplemented) ||    \
+         (((out)=PyArray_FromArrayAttr(op, type, context)) !=           \
+          Py_NotImplemented))
+#define PyArray_HasArrayInterface(op, out)              \
+        PyArray_HasArrayInterfaceType(op, NULL, NULL, out)
 
 #define PyArray_IsZeroDim(op) (PyArray_Check(op) && (PyArray_NDIM(op) == 0))
 #define PyArray_IsScalar(obj, cls)                              \

Modified: trunk/numpy/core/src/arrayobject.c
===================================================================
--- trunk/numpy/core/src/arrayobject.c	2006-09-28 16:22:43 UTC (rev 3232)
+++ trunk/numpy/core/src/arrayobject.c	2006-09-28 17:46:22 UTC (rev 3233)
@@ -1158,7 +1158,7 @@
 PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object)
 {
         PyArrayObject *src;
-        PyArray_Descr* dtype;
+        PyObject *r;
         int ret;
 
         /* Special code to mimic Numeric behavior for
@@ -1184,17 +1184,24 @@
         }
 
         if (PyArray_Check(src_object)) {
-                dtype = NULL;
+                src = (PyArrayObject *)src_object;
+                Py_INCREF(src);
         }
+        else if (!PyArray_IsScalar(src_object, Generic) && 
+                 PyArray_HasArrayInterface(src_object, r)) {
+                src = (PyArrayObject *)r;
+        }
         else {
+                PyArray_Descr* dtype;
                 dtype = dest->descr;
                 Py_INCREF(dtype);
+                src = (PyArrayObject *)PyArray_FromAny(src_object, dtype, 0,
+                                                       dest->nd,
+                                                       FORTRAN_IF(dest), 
+                                                       NULL);
         }
-        src = (PyArrayObject *)PyArray_FromAny(src_object, dtype, 0,
-                                               dest->nd,
-                                               FORTRAN_IF(dest), NULL);
         if (src == NULL) return -1;
-
+        
         ret = PyArray_MoveInto(dest, src);
         Py_DECREF(src);
         return ret;
@@ -8253,10 +8260,7 @@
             if (flags & UPDATEIFCOPY) goto err;
             r = Array_FromPyScalar(op, newtype);
         }
-        else if (((r = PyArray_FromStructInterface(op))!=Py_NotImplemented)|| \
-                 ((r = PyArray_FromInterface(op)) != Py_NotImplemented) || \
-                 ((r = PyArray_FromArrayAttr(op, newtype, context))     \
-                  != Py_NotImplemented)) {
+        else if (PyArray_HasArrayInterfaceType(op, newtype, context, r)) {
                 PyObject *new;
                 if (r == NULL) {Py_XDECREF(newtype); return NULL;}
                 if (newtype != NULL || flags != 0) {



More information about the Numpy-svn mailing list