• Eddie Elizondo's avatar
    bpo-37879: Suppress subtype_dealloc decref when base type is a C heap type (GH-15323) · ff023ed3
    Eddie Elizondo authored
    The instance destructor for a type is responsible for preparing
    an instance for deallocation by decrementing the reference counts
    of its referents.
    
    If an instance belongs to a heap type, the type object of an instance
    has its reference count decremented while for static types, which
    are permanently allocated, the type object is unaffected by the
    instance destructor.
    
    Previously, the default instance destructor searched the class
    hierarchy for an inherited instance destructor and, if present,
    would invoke it.
    
    Then, if the instance type is a heap type, it would decrement the
    reference count of that heap type.  However, this could result in the
    premature destruction of a type because the inherited instance
    destructor should have already decremented the reference count
    of the type object.
    
    This change avoids the premature destruction of the type object
    by suppressing the decrement of its reference count when an
    inherited, non-default instance destructor has been invoked.
    
    Finally, an assertion on the Py_SIZE of a type was deleted.  Heap
    types have a non zero size, making this into an incorrect assertion.
    
    https://github.com/python/cpython/pull/15323
    ff023ed3
test_capi.py 28.5 KB