[Numpy-discussion] fromiter and objects

Travis Oliphant oliphant at ee.byu.edu
Wed Nov 29 10:28:52 CST 2006


Tim Hochberg wrote:

>things are often not as easy as they appear, the real reason I'm writing 
>is this comment that explains why object arrays are disallowed in 
>fromiter (multiarraymodule.c::PyArray_:FromIter)
>
>            /* We would need to alter the memory RENEW code to decrement any
>               reference counts before just throwing away the memory.
>             */
>
>This doesn't seem right. The array that we would be RENEWing is a bunch 
>of PyObject*s. The reference counts don't reside there, but in the 
>objects themselves. When we do the RENEW, we don't want the reference 
>counts to change at all. 
>
I'm not sure if you are still thinking about this.  I suspect I added 
the comment because I was concerned about two things:

1) a resize that deletes memory without first decrefing object counts 
--- I suspose this can't happen here, though, because RENEW is always 
"growing" memory, right?

2) a resize that grows memory without inserting NULLS.  For Object array 
manipulation to work, you need initialized (to NULL) "empty" memory. 

>The one tricky case is if we run out of memory, 
>I'm not certain that the current setup correctly deals with reference 
>counts in this case, although it appears likely that it should work 
>since ret->data should still point to a valid chunk of memory and 
>decreffing ret should result in the subsequent deallocation of all the 
>  
>
>stored objects.
>  
>
As long as you don't store the pointer to new memory until after the 
RENEW was successful then this should work.

I think my comment came from the possibility of #1 in general use of 
RENEW, but I don't think that is going to happen.  Therefore, the only 
tweak that seams necessary is to initialize any new memory to NULL for 
OBJECT arrays.

-Travis





More information about the Numpy-discussion mailing list