]> granicus.if.org Git - python/commit
Add Garbage Collection support to new-style classes (not yet to their
authorGuido van Rossum <guido@python.org>
Tue, 2 Oct 2001 21:24:57 +0000 (21:24 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 2 Oct 2001 21:24:57 +0000 (21:24 +0000)
commit048eb75c2dca8bf6d483b290c901a53510c9b78a
tree4ffa13f63991488114f0e5c0d57983c0d80481e3
parent0481d24dd51bf3a346b432e1c065ed027bccb5c4
Add Garbage Collection support to new-style classes (not yet to their
instances).

Also added GC support to various auxiliary types: super, property,
descriptors, wrappers, dictproxy.  (Only type objects have a tp_clear
field; the other types are.)

One change was necessary to the GC infrastructure.  We have statically
allocated type objects that don't have a GC header (and can't easily
be given one) and heap-allocated type objects that do have a GC
header.  Giving these different metatypes would be really ugly: I
tried, and I had to modify pickle.py, cPickle.c, copy.py, add a new
invent a new name for the new metatype and make it a built-in, change
affected tests...  In short, a mess.  So instead, we add a new type
slot tp_is_gc, which is a simple Boolean function that determines
whether a particular instance has GC headers or not.  This slot is
only relevant for types that have the (new) GC flag bit set.  If the
tp_is_gc slot is NULL (by far the most common case), all instances of
the type are deemed to have GC headers.  This slot is called by the
PyObject_IS_GC() macro (which is only used twice, both times in
gcmodule.c).

I also changed the extern declarations for a bunch of GC-related
functions (_PyObject_GC_Del etc.): these always exist but objimpl.h
only declared them when WITH_CYCLE_GC was defined, but I needed to be
able to reference them without #ifdefs.  (When WITH_CYCLE_GC is not
defined, they do the same as their non-GC counterparts anyway.)
Include/object.h
Include/objimpl.h
Lib/test/test_gc.py
Objects/descrobject.c
Objects/typeobject.c