[Numpy-discussion] segfaults when passing ndarray subclass to ufunc with out=None

Darren Dale dsdale24 at gmail.com
Sun Mar 8 10:18:24 EDT 2009


On Sun, Feb 8, 2009 at 12:49 PM, Darren Dale <dsdale24 at gmail.com> wrote:

> I am seeing some really strange behavior when I try to pass an ndarray
> subclass and out=None to numpy's ufuncs. This example will reproduce the
> problem with svn numpy, the first print statement yields 1 as expected, the
> second yields  "<type 'builtin_function_or_method'>" and the third yields a
> segmentation fault:
>
> import numpy as np
>
> class MyArray(np.ndarray):
>
>     __array_priority__ = 20
>
>     def __new__(cls):
>         return np.asarray(1).view(cls).copy()
>
>     def __repr__(self):
>         return 'my_array'
>
>     __str__ = __repr__
>
>     def __mul__(self, other):
>         return super(MyArray, self).__mul__(other)
>
>     def __rmul__(self, other):
>         return super(MyArray, self).__rmul__(other)
>
> mine = MyArray()
> print np.multiply(1, 1, None)
> x = np.multiply(mine, mine, None)
> print type(x)
> print x
>


I think I might have found a fix for this. The following patch allows my
script to run without a segfault:

$ svn diff
Index: umath_ufunc_object.inc
===================================================================
--- umath_ufunc_object.inc      (revision 6566)
+++ umath_ufunc_object.inc      (working copy)
@@ -3212,13 +3212,10 @@
         output_wrap[i] = wrap;
         if (j < nargs) {
             obj = PyTuple_GET_ITEM(args, j);
-            if (obj == Py_None) {
-                continue;
-            }
             if (PyArray_CheckExact(obj)) {
                 output_wrap[i] = Py_None;
             }
-            else {
+            else if (obj != Py_None) {
                 PyObject *owrap =
PyObject_GetAttrString(obj,"__array_wrap__");
                 incref = 0;
                 if (!(owrap) || !(PyCallable_Check(owrap))) {


That call to continue skipped this bit of code in the loop, which is
apparently important:

        if (incref) {
            Py_XINCREF(output_wrap[i]);
        }


I've tested the trunk on 64 bit linux, with and without this patch applied,
and I get the same result in both cases: 1 known failure, 11 skips. Is there
any chance someone could consider applying this patch before 1.3 ships?

Darren
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20090308/0b26e8f3/attachment.html>


More information about the NumPy-Discussion mailing list