[Python-Dev] PEP 342/343 status?

Phillip J. Eby pje at telecommunity.com
Tue May 31 21:27:38 CEST 2005


At 12:03 PM 5/31/2005 -0700, Guido van Rossum wrote:
>Yes, the generator does clear its f_back when it's suspended.

I realize this won't fix all your worries; I just want to rule out this one 
*particular* form of cycle as a possibility; i.e., to show that mere 
reference to a generator-iterator in a frame does not create a cycle:


     callerframe ---------> traceback2
        |     ^                |  |
        |     |                |  |
        |     +----------------+  |
        v                         v
     geniter -> genframe -> traceback1
                    ^          |
                    |          |
                    +----------+

As you can see, the geniter itself doesn't have a reference to its calling 
frame, so as soon as the highest-level traceback object is released, the 
cycle collector should release the upper cycle, allowing the geniter to 
complete, and releasing the lower cycle.

The scenario assumes, by the way, that the traceback object referenced by a 
frame includes a pointer to that same frame, which I'm not sure is the 
case.  I was under the impression that the current frame is only added to 
the traceback when the frame is exited, in which case the two cycles shown 
above wouldn't even exist; each traceback  would be pointing to the *next* 
frame down, and there would be no cycles at all.  It seems to me that this 
would almost have to be the design, since tracebacks existed before cyclic 
GC did.


>Sure. But I still have some reservations, since cycles can pop up in
>the strangest of places (especially when tracebacks are involved --
>tracebacks have been causing problems due to cycles and keeping
>variables alive almost since Python's inception). I posted about this
>a while ago, but don't recall seeing a response that took my fear
>away.

Well, I can't prove that it's not possible to create such cycles, 
certainly.  But maybe we should finally get rid of the deprecated 
sys.exc_type/value/traceback variables, so that they can't root any cycles?



More information about the Python-Dev mailing list