[Python-bugs-list] [ python-Bugs-751998 ] Object destruction is broken for slots
SourceForge.net
noreply@sourceforge.net
Fri, 13 Jun 2003 12:42:25 -0700
Bugs item #751998, was opened at 2003-06-10 11:55
Message generated for change (Comment added) made by gvanrossum
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=751998&group_id=5470
Category: Python Interpreter Core
>Group: Python 2.2.3
Status: Open
>Resolution: Fixed
Priority: 6
Submitted By: Kevin Jacobs (jacobs99)
>Assigned to: Neal Norwitz (nnorwitz)
Summary: Object destruction is broken for slots
Initial Comment:
The following code worked without errors in
Python 2.3b1, but seems to be broken in
the current Python 2.3 CVS:
class Foo(object):
__slots__ = ('bar','__dict__')
def __init__(self):
self.bar = 1
self.baz = 2
def __del__(self):
print 'In __del__.'
print ' baz =',self.baz
print ' bar =',self.bar
foo=Foo()
Python 2.3b1: No error, output:
In __del__.
baz = 2
bar = 1
However, the current CVS outputs:
In __del__.
baz = 2
Exception exceptions.AttributeError: 'bar' in
<bound method Foo.__del__ of
<__main__.Foo object at 0x403ace6c>> ignored
Somehow, descriptor lookup seems to be failing
in objects that are in the process of being deleted,
since commenting out the __slots__ declaration
makes the problem go away.
I wish I had time to look into this, but I'm currently
swamped. Hopefully this is the result of something
recent and this report will trigger some light-bulbs.
If not, I'll see if I can make time next week. As it
stands, I see this as a serious bug, since it prevents
finalization from completing on these objects.
----------------------------------------------------------------------
>Comment By: Guido van Rossum (gvanrossum)
Date: 2003-06-13 15:42
Message:
Logged In: YES
user_id=6380
Thanks! Fixed in CVS for 2.3. This should be backported to
2.2 too; assiged to Neal Norwitz for that purpose.
----------------------------------------------------------------------
Comment By: Kevin Jacobs (jacobs99)
Date: 2003-06-10 14:24
Message:
Logged In: YES
user_id=459565
er, see Bug 742911 instead.
----------------------------------------------------------------------
Comment By: Kevin Jacobs (jacobs99)
Date: 2003-06-10 14:21
Message:
Logged In: YES
user_id=459565
Oh, and with the patch, 'make test' completes without
any new errors, my attached test case works, as does
the minimal test case associated with Bug 751998.
----------------------------------------------------------------------
Comment By: Kevin Jacobs (jacobs99)
Date: 2003-06-10 14:19
Message:
Logged In: YES
user_id=459565
Okay, I had a few minutes free. The problem is that
slots are being deallocated too early -- before tp_dealloc.
I'm attaching a patch that corrects this at the expense of
having to travel up the path of base class tp_dealloc
entries twice. Here is the new sequence of actions:
1) Find the nearest base with a different tp_dealloc
2) Clear weakrefs
3) Call finalizer
4) Check to see if object was resurrected, if so stop
5) Clear all slots up to nearest base with a different
tp_dealloc
6) DECREF dict pointer, if necessary
7) proceed as usual... (call basedealloc, DECREF type, etc.)
Without my patch, step number 5 is done as part of step
1, and bad things happen.
----------------------------------------------------------------------
Comment By: Kevin Jacobs (jacobs99)
Date: 2003-06-10 13:07
Message:
Logged In: YES
user_id=459565
The fix checked in to solve Bug 751998 is the cause of this
potentially more serious one bug. I have yet to figure
out why, though I have isolated the problem to revision
2.234 of typeobject.c. I've not looked to see if this also
affects Python 2.2.3, though I wouldn't be too suprised if it
does.
More soon, hopefully. Maybe...
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=751998&group_id=5470