numarray bug or my?

Marco Bubke marco at bubke.de
Tue Feb 24 12:34:09 EST 2004


Marco Bubke wrote:

> Simon Burton wrote:
> 
>> On Mon, 23 Feb 2004 23:14:03 +0100, Marco Bubke wrote:
>> 
>> ...
>>> Ok, its in Pyrex and has a bug in
>>> flat_view = array_to_int(viewport),
>>> but I don't know why. If I change the code to flat_view =
>>> array_to_double(viewport) its runnig without glitches. I really dont
>>> understand it.
>>> 
>>> Thx
>>> 
>>> Marco
>> 
>> Yes, me too. I wasn't sure if NA_InputArray was supposed
>> to be able to handle type conversions, so I used the python
>> method:
>> 
>> array = array.astype(numarray.Int32)
>> 
>> and then used NA_InputArray on that.
>> 
>> Simon.
> 
> Ok, Than I do that, I get everytime a Segmentation fault. Before it was
> only from time to time. An its 100% NA_InputArray. If I erease
> NA_updateDataPtr before NA_InputArray I get a amok process.
> 
> cdef NumArray array_to_float(NumArray array):
>   # maybe here is memoty leak!
>   cdef NumArray flat_array
>   cdef NumArray new_array
>   print 'mark 1'
>   new_array = array.astype('Float32')
>   print new_array
>   print 'mark 2'
>   new_array = NA_updateDataPtr(new_array)
>   print 'mark 3'
>   NA_IoArray(new_array, tFloat32, NUM_C_ARRAY)
>   print 'mark 4'
>   flat_array = NA_updateDataPtr(flat_array)
>   print 'mark 5'
>   return flat_array


Ok, I have it tracked down to 

static PyArrayObject*
NA_InputArray(PyObject *a, NumarrayType t, int requires)
{
  printf("enter input\n");
  PyArrayObject *wa = NULL;
  if (NA_isPythonScalar(a)) {
    if (t == tAny) 
      t = NA_NumarrayType(a);
    if (t < 0) goto _exit;
    wa = NA_vNewArray( NULL, t, 0, NULL);
    if (!wa) goto _exit;
    if (NA_setFromPythonScalar(wa, 0, a) < 0) {
      Py_DECREF(wa);
      wa = NULL;
    }
    goto _exit;
  } else if ((wa = sequenceAsArray(a, &t))) {
    printf("input 1\n");
    if (!satisfies(wa, requires, t)) {
      printf("input 2\n");  
      PyArrayObject *wa2 = getArray(wa, t, "astype");
      printf("input 3\n");       
      Py_DECREF(wa);
      printf("input 4\n");  
      wa = wa2;
    }
    printf("input 5\n");  
    NA_updateDataPtr(wa);
  }
  _exit:
  printf("leave input\n");
  return wa;
}

static PyArrayObject *
NA_updateDataPtr(PyArrayObject *me)
{
  printf("enter update\n");
  if (!me) return me;
  printf("update 1\n");
  if (getReadBufferDataPtr (me->_data, (void **) &me->data) < 0) {
      printf("update 2\n");
    return (PyArrayObject *) PyErr_Format(_Error, 
        "NA_updateDataPtr: error getting read buffer data ptr");
  }

      printf("update 3\n");
  if (isBufferWriteable( me->_data ))
    me->flags |= WRITABLE;
  else
    me->flags &= ~WRITABLE;
  printf("leave update\n");
  return me;
}

static int 
getReadBufferDataPtr(PyObject *buffobj, void **buff) 
{
  printf("enter read buffer");
  int rval = -1;
  PyObject *buff2;
    printf("read buffer 1");
  if ((buff2 = getBuffer(buffobj))) {
      printf("read buffer 2");
    if (buff2->ob_type->tp_as_buffer->bf_getreadbuffer)
          printf("read buffer 3");
      rval = buff2->ob_type->tp_as_buffer->bf_getreadbuffer(buff2, 
                  0, buff);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        printf("read buffer 4");
    Py_DECREF(buff2);
  }
  printf("leave read buffer");
  return rval;
}

The Segmentation fault is happen between "read buffer 3" and "read buffer
4". But this a little bit to much Python inside for me. Maybe the .data
isn't right?

regards

Marco



More information about the Python-list mailing list