[Numpy-discussion] Travis: this looks like a bug in ufuncobject.c

Travis E. Oliphant oliphant at enthought.com
Mon Jun 23 10:35:58 EDT 2008


Charles R Harris wrote:
> select_types(PyUFuncObject *self, int *arg_types,
>              PyUFuncGenericFunction *function, void **data,
>              PyArray_SCALARKIND *scalars,
>              PyObject *typetup)
> {
>     int i, j;
>     char start_type;
>     int userdef=-1;
>     int userdef_ind=-1;
>
>     if (self->userloops) {
>         for(i=0; i<self->nin; i++) {
>             if (PyTypeNum_ISUSERDEF(arg_types[i])) {
>                 userdef = arg_types[i];
>         userdef_ind = i;
>                 break;
>             }
>         }
>     }
>
>     if (typetup != NULL)
>         return extract_specified_loop(self, arg_types, function, data,
>                                       typetup, userdef);
>
>     if (userdef > 0) {
>        ^^^^^^^^^^^^
>         PyObject *key, *obj;
>         int ret=-1;
>         obj = NULL;
>     /* Look through all the registered loops for all the user-defined
>        types to find a match.
>      */
>     while (ret == -1) {
>         if (userdef_ind >= self->nin) break;
>         userdef = arg_types[userdef_ind++];
>         if (!(PyTypeNum_ISUSERDEF(userdef))) continue;
>         key = PyInt_FromLong((long) userdef);
>         if (key == NULL) return -1;
>         obj = PyDict_GetItem(self->userloops, key);
>         Py_DECREF(key);
>         if (obj == NULL) continue;
>         /* extract the correct function
>            data and argtypes for this user-defined type.
>         */
>         ret = _find_matching_userloop(obj, arg_types, scalars,
>                       function, data, self->nargs,
>                       self->nin);
>     }
>     if (ret == 0) return ret;
>     PyErr_SetString(PyExc_TypeError, _types_msg);
>     return ret;
>     }
> ...
>
> It looks like the test should be userdef >= 0.
>
What leads you to say that? 

-Travis




More information about the NumPy-Discussion mailing list