[Numpy-svn] r3407 - trunk/numpy/core/src

numpy-svn at scipy.org numpy-svn at scipy.org
Fri Oct 27 15:42:02 CDT 2006


Author: oliphant
Date: 2006-10-27 15:41:58 -0500 (Fri, 27 Oct 2006)
New Revision: 3407

Modified:
   trunk/numpy/core/src/arrayobject.c
   trunk/numpy/core/src/scalartypes.inc.src
Log:
More fixes to allow user-defined types in C.

Modified: trunk/numpy/core/src/arrayobject.c
===================================================================
--- trunk/numpy/core/src/arrayobject.c	2006-10-27 16:56:32 UTC (rev 3406)
+++ trunk/numpy/core/src/arrayobject.c	2006-10-27 20:41:58 UTC (rev 3407)
@@ -1316,11 +1316,11 @@
         type_num = descr->type_num;
         if (type_num == PyArray_BOOL)
                 PyArrayScalar_RETURN_BOOL_FROM_LONG(*(Bool*)data);
-        else if (type_num == PyArray_OBJECT) {
+        else if (type_num == PyArray_OBJECT ||          \
+                 ((type=descr->typeobj)==NULL)) {
                 return descr->f->getitem(data, base);
         }
         itemsize = descr->elsize;
-        type = descr->typeobj;
         copyswap = descr->f->copyswap;
         swap = !PyArray_ISNBO(descr->byteorder);
         if PyTypeNum_ISSTRING(type_num) { /* Eliminate NULL bytes */
@@ -1541,7 +1541,8 @@
 
         for (i=0; i<NPY_NUMUSERTYPES; i++) {
                 descr = userdescrs[i];
-                if (strcmp(descr->typeobj->tp_name, str) == 0)
+                if (descr->typeobj && 
+                    strcmp(descr->typeobj->tp_name, str) == 0)
                         return descr->type_num;
         }
 
@@ -1588,10 +1589,12 @@
                                 " is missing.");
                 return -1;
         }
+        /*
         if (descr->typeobj == NULL) {
                 PyErr_SetString(PyExc_ValueError, "missing typeobject");
                 return -1;
         }
+        */
         userdescrs = realloc(userdescrs,
                              (NPY_NUMUSERTYPES+1)*sizeof(void *));
         if (userdescrs == NULL) {
@@ -10576,7 +10579,7 @@
                 Py_INCREF(new->subarray->shape);
                 Py_INCREF(new->subarray->base);
         }
-        Py_INCREF(new->typeobj);
+        Py_XINCREF(new->typeobj);
         return new;
 }
 
@@ -10658,8 +10661,14 @@
         PyObject *res;
 	char *s;
         static int prefix_len=0;
-
+        
         if (PyTypeNum_ISUSERDEF(self->type_num)) {
+                if (typeobj == NULL) {
+                        return PyString_FromFormat("%s%d (%d)", 
+                                                   self->kind,
+                                                   self->elsize,
+                                                   self->type_num);
+                }
 		s = strrchr(typeobj->tp_name, '.');
 		if (s == NULL) {
 			res = PyString_FromString(typeobj->tp_name);
@@ -10883,6 +10892,10 @@
         Py_DECREF(mod);
         if (obj == NULL) {Py_DECREF(ret); return NULL;}
         PyTuple_SET_ITEM(ret, 0, obj);
+        if (self->typeobj == NULL) { /* Must handle this case in getitem */
+                obj = self->f->getitem(NULL, NULL);
+                if (obj == NULL) {Py_DECREF(ret); return NULL;}
+        }
         if (PyTypeNum_ISUSERDEF(self->type_num) ||              \
             ((self->type_num == PyArray_VOID &&                 \
               self->typeobj != &PyVoidArrType_Type))) {

Modified: trunk/numpy/core/src/scalartypes.inc.src
===================================================================
--- trunk/numpy/core/src/scalartypes.inc.src	2006-10-27 16:56:32 UTC (rev 3406)
+++ trunk/numpy/core/src/scalartypes.inc.src	2006-10-27 20:41:58 UTC (rev 3407)
@@ -32,6 +32,8 @@
 scalar_value(PyObject *scalar, PyArray_Descr *descr)
 {
         int type_num;
+        int align;
+        intp memloc;
         if (descr == NULL) {
                 descr = PyArray_DescrFromScalar(scalar);
                 type_num = descr->type_num;
@@ -111,8 +113,17 @@
         }
         else _IFCASE(Object);
         
-        PyErr_SetString(PyExc_RuntimeError, "bad scalar");
-        return NULL;
+
+        /* Use the alignment flag to figure out where the data begins
+           after a PyObject_HEAD
+        */
+        memloc = (intp)scalar;
+        memloc += sizeof(PyObject);
+        /* now round-up to the nearest alignment value 
+         */
+        align = descr->alignment;
+        if (align > 1) memloc = ((memloc + align - 1)/align)*align;
+        return (void *)memloc
 #undef _IFCASE
 #undef _OBJ
 #undef _CHK
@@ -2578,7 +2589,7 @@
                 conv->subarray = NULL;
                 Py_DECREF(conv);
         }
-        Py_DECREF(new->typeobj);
+        Py_XDECREF(new->typeobj);
         new->typeobj = (PyTypeObject *)type;
         Py_INCREF(type);
         return new;
@@ -2651,7 +2662,7 @@
 
 /* New reference */
 /*OBJECT_API
- Get a typeobject from a type-number
+ Get a typeobject from a type-number -- can return NULL.
 */
 static PyObject *
 PyArray_TypeObjectFromType(int type)
@@ -2662,7 +2673,7 @@
         descr = PyArray_DescrFromType(type);
         if (descr == NULL) return NULL;
         obj = (PyObject *)descr->typeobj;
-        Py_INCREF(obj);
+        Py_XINCREF(obj);
         Py_DECREF(descr);
         return obj;
 }



More information about the Numpy-svn mailing list