• Guido van Rossum's avatar
    Add Garbage Collection support to new-style classes (not yet to their · 048eb75c
    Guido van Rossum authored
    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.)
    048eb75c
objimpl.h 11.8 KB