I've just submitted patch 1223381 (http://python.org/sf/1223381), which 
implements code and test changes for:

* yield expressions
* bare yield (short for yield None)
* yield in try/finally
* generator.send(value) (send value into generator; substituted for PEP 
342's next(arg))
* generator.throw(typ[,val[,tb]]) (raise error in generator)
* generator.close()
* GeneratorExit built-in exception type
* generator.__del__ (well, the C equivalent)
* All necessary mods to the compiler, parser module, and Python 'compiler' 
package to support these changes.

It was necessary to change a small part of the eval loop (well, the 
initialization, not the loop) and the gc module's has_finalizer() logic in 
order to support a C equivalent to __del__.  Specialists in these areas 
should probably scrutinize this patch!

There is one additional implementation detail that was not contemplated in 
either PEP. in order to prevent used-up generators from retaining 
unnecessary references to their frame's contents, I set the generator's 
gi_frame member to None whenever the generator finishes normally or with an 
error.  Thus, an exhausted generator cannot be part of a cycle, and it 
releases its frame object sooner than in previous Python versions.  For 
generators used only in a direct "for" loop, this makes no difference, but 
for generators used with the iterator protocol (i.e. "gen.next()") from 
Python, this avoids stranding the generator's frame in a traceback cycle.

Anyway, your comments/questions/feedback/bug reports are welcome.

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to