[pypy-svn] r61467 - in pypy/trunk/pypy/interpreter: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Jan 30 19:20:44 CET 2009
Author: arigo
Date: Fri Jan 30 19:20:44 2009
New Revision: 61467
Modified:
pypy/trunk/pypy/interpreter/generator.py
pypy/trunk/pypy/interpreter/test/test_generator.py
pypy/trunk/pypy/interpreter/typedef.py
Log:
Make sure gi_frame returns None when the generator is finished. Bit of
a hack (ideally the internal self.frame should be set to None) but it
can be done with minimal changes to the rest of the logic.
Modified: pypy/trunk/pypy/interpreter/generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/generator.py (original)
+++ pypy/trunk/pypy/interpreter/generator.py Fri Jan 30 19:20:44 2009
@@ -111,6 +111,12 @@
msg = "generator ignored GeneratorExit"
raise OperationError(space.w_RuntimeError, space.wrap(msg))
+ def descr_gi_frame(space, self):
+ if not self.frame.frame_finished_execution:
+ return self.frame
+ else:
+ return space.w_None
+
def descr__del__(self):
"""
applevel __del__, which is called at a safe point after the
Modified: pypy/trunk/pypy/interpreter/test/test_generator.py
==============================================================================
--- pypy/trunk/pypy/interpreter/test/test_generator.py (original)
+++ pypy/trunk/pypy/interpreter/test/test_generator.py Fri Jan 30 19:20:44 2009
@@ -120,6 +120,14 @@
g = f()
raises(TypeError, g.throw, NameError("Error"), None, "not tb object")
+ def test_throw_finishes_generator(self):
+ def f():
+ yield 1
+ g = f()
+ assert g.gi_frame is not None
+ raises(ValueError, g.throw, ValueError)
+ assert g.gi_frame is None
+
def test_close(self):
def f():
yield 1
Modified: pypy/trunk/pypy/interpreter/typedef.py
==============================================================================
--- pypy/trunk/pypy/interpreter/typedef.py (original)
+++ pypy/trunk/pypy/interpreter/typedef.py Fri Jan 30 19:20:44 2009
@@ -866,7 +866,7 @@
__del__ = interp2app(GeneratorIterator.descr__del__,
descrmismatch='__del__'),
gi_running = interp_attrproperty('running', cls=GeneratorIterator),
- gi_frame = interp_attrproperty('frame', cls=GeneratorIterator),
+ gi_frame = GetSetProperty(GeneratorIterator.descr_gi_frame),
__weakref__ = make_weakref_descr(GeneratorIterator),
)
GeneratorIterator.typedef.acceptable_as_base_class = False
More information about the Pypy-commit
mailing list