From: Todd M. <jm...@st...> - 2004-07-01 20:02:09
|
On Thu, 2004-07-01 at 14:51, Tim Hochberg wrote: > Todd Miller wrote: > > >On Wed, 2004-06-30 at 19:00, Tim Hochberg wrote: > > > > > >>>> > >>>> > >>>> > >>>FYI, the issue with tp_dealloc may have to do with which mode Python is > >>>compiled in, --with-pydebug, or not. One approach which seems like it > >>>ought to work (just thought of this!) is to add an extra reference in C > >>>to the NumArray instance __dict__ (from NumArray.__init__ and stashed > >>>via a new attribute in the PyArrayObject struct) and then DECREF it as > >>>the last part of the tp_dealloc. > >>> > >>> > >>> > >>> > >>That sounds promising. > >> > >> > > <> > > I looked at this some, and while INCREFing __dict__ maybe the right > > idea, I forgot that there *is no* Python NumArray.__init__ anymore. > > > > So the INCREF needs to be done in C without doing any getattrs; this > > seems to mean calling a private _PyObject_GetDictPtr function to get a > > pointer to the __dict__ slot which can be dereferenced to get the > > __dict__. > > Might there be a simpler way? Since you're putting an extra attribute on > the PyArrayObject structure anyway, wouldn't it be possible to just > stash _shadows there instead of the reference to the dictionary? _shadows is already in the struct. The root problem (I recall) is not the loss of self->_shadows, it's the loss self->__dict__ before self can be copied onto self->_shadows. The cause of the problem appeared to me to be the tear down order of self: the NumArray part appeared to be torn down before the _numarray part, and the tp_dealloc needs to do a Python callback where a half destructed object just won't do. To really know what the problem is, I need to stick tp_dealloc back in and see what breaks. I'm pretty sure the problem was a missing instance __dict__, but my memory is quite fallable. Todd |