- 09 Nis, 2003 3 kayıt (commit)
-
-
Fred Drake yazdı
-
Skip Montanaro yazdı
-
Skip Montanaro yazdı
-
- 08 Nis, 2003 11 kayıt (commit)
-
-
Jeremy Hylton yazdı
If a class was defined inside a function, used a static or class method, and used super() inside the method body, it would be caught in an uncollectable cycle. (Simplified version: The static/class method object would point to a function object with a closure that referred to the class.) Bugfix candidate.
-
Just van Rossum yazdı
when DST began.
-
Skip Montanaro yazdı
-
Skip Montanaro yazdı
-
Tim Peters yazdı
These never failed in 2.3, and the tests confirm it. They still blow up in the 2.2 branch, despite that all the gc-vs-__del__ fixes from 2.3 have been backported (and this is expected -- 2.2 needs more work than 2.3 needed).
-
Skip Montanaro yazdı
-
Tim Peters yazdı
-
Fred Drake yazdı
Based on a suggestion from a reader.
-
Fred Drake yazdı
-
Tim Peters yazdı
-
Tim Peters yazdı
cases, wrote docs, added a test.
-
- 07 Nis, 2003 5 kayıt (commit)
-
-
Tim Peters yazdı
-
Tim Peters yazdı
of PyObject_HasAttr(); the former promises never to execute arbitrary Python code. Undid many of the changes recently made to worm around the worst consequences of that PyObject_HasAttr() could execute arbitrary Python code. Compatibility is hard to discuss, because the dangerous cases are so perverse, and much of this appears to rely on implementation accidents. To start with, using hasattr() to check for __del__ wasn't only dangerous, in some cases it was wrong: if an instance of an old- style class didn't have "__del__" in its instance dict or in any base class dict, but a getattr hook said __del__ existed, then hasattr() said "yes, this object has a __del__". But instance_dealloc() ignores the possibility of getattr hooks when looking for a __del__, so while object.__del__ succeeds, no __del__ method is called when the object is deleted. gc was therefore incorrect in believing that the object had a finalizer. The new method doesn't suffer that problem (like instance_dealloc(), _PyObject_Lookup() doesn't believe __del__ exists in that case), but does suffer a somewhat opposite-- and even more obscure --oddity: if an instance of an old-style class doesn't have "__del__" in its instance dict, and a base class does have "__del__" in its dict, and the first base class with a "__del__" associates it with a descriptor (an object with a __get__ method), *and* if that descriptor raises an exception when __get__ is called, then (a) the current method believes the instance does have a __del__, but (b) hasattr() does not believe the instance has a __del__. While these disagree, I believe the new method is "more correct": because the descriptor *will* be called when the object is destructed, it can execute arbitrary Python code at the time the object is destructed, and that's really what gc means by "has a finalizer": not specifically a __del__ method, but more generally the possibility of executing arbitrary Python code at object destruction time. Code in a descriptor's __get__() executed at destruction time can be just as problematic as code in a __del__() executed then. So I believe the new method is better on all counts. Bugfix candidate, but it's unclear to me how all this differs in the 2.2 branch (e.g., new-style and old-style classes already took different gc paths in 2.3 before this last round of patches, but don't in the 2.2 branch).
-
Tim Peters yazdı
out whether __del__ exists, without executing any Python-level code.
-
Anthony Baxter yazdı
-
Anthony Baxter yazdı
-
- 06 Nis, 2003 6 kayıt (commit)
-
-
Tim Peters yazdı
-
Tim Peters yazdı
instead of looping. Smaller and clearer. Faster, too, when we're not appending to gc.garbage: gc_list_merge() takes constant time, regardless of the lists' sizes. append_objects(): Moved up to live with the other list manipulation utilities.
-
Raymond Hettinger yazdı
mwh pointed out that the error message did not make sense if obtained by rearranging the bases.
-
Raymond Hettinger yazdı
-
Tim Peters yazdı
take no arguments; cuts generated code size.
-
Tim Peters yazdı
externally unreachable objects with finalizers, and externally unreachable objects without finalizers reachable from such objects. This allows us to call has_finalizer() at most once per object, and so limit the pain of nasty getattr hooks. This fixes the failing "boom 2" example Jeremy posted (a non-printing variant of which is now part of test_gc), via never triggering the nasty part of its __getattr__ method.
-
- 05 Nis, 2003 4 kayıt (commit)
-
-
Tim Peters yazdı
to special-case classic classes, or to worry about refcounts; has_finalizer() deleted the current object iff the first entry in the unreachable list has changed. I don't believe it was correct to check for ob_refcnt == 1, either: the dealloc routine would get called by Py_DECREF then, but there's nothing to stop the dealloc routine from ressurecting the object, and then gc would remain at the head of the unreachable list despite that its refcount temporarily fell to 0 (and that would lead to an infinite loop in move_finalizers()). I'm still worried about has_finalizer() resurrecting other objects in the unreachable list: what's to stop them from getting collected?
-
Tim Peters yazdı
change (it would be another kind of bug if the trash cycle weren't reclaimed).
-
Tim Peters yazdı
squashed-together conditional operators; makes it much easier to step thru in the debugger, and to set a breakpoint on the only dangerous path.
-
Tim Peters yazdı
delstr from initgc() into collect(). initgc() isn't called unless the user explicitly imports gc, so can be used only for initialization of user-visible module features; delstr needs to be initialized for proper internal operation, whether or not gc is explicitly imported. Bugfix candidate? I don't know whether the new bug was backported to 2.2 already.
-
- 04 Nis, 2003 4 kayıt (commit)
-
-
Raymond Hettinger yazdı
-
Jeremy Hylton yazdı
-
Jeremy Hylton yazdı
move_finalizers() moves every object from unreachable to collectable or finalizers, unless the object is deallocated first.
-
Greg Ward yazdı
opening it in non-blocking mode. Both Guido and David Hammerton have reported that this fixes their problems with ossaudiodev -- hooray!
-
- 03 Nis, 2003 3 kayıt (commit)
-
-
Jeremy Hylton yazdı
-
Jeremy Hylton yazdı
-
Martin v. Löwis yazdı
-
- 02 Nis, 2003 3 kayıt (commit)
-
-
Walter Dörwald yazdı
-
Walter Dörwald yazdı
an OverflowError instead of a TypeError to be consistent with "%c" % 256. See SF patch #710127.
-
Barry Warsaw yazdı
-
- 01 Nis, 2003 1 kayıt (commit)
-
-
Jack Jansen yazdı
-