Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r48653:82489bdede61 Date: 2011-11-01 21:20 -0400 http://bitbucket.org/pypy/pypy/changeset/82489bdede61/
Log: fix for the failing test - StopIteration raised from anywhere kills the generator diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py --- a/pypy/interpreter/generator.py +++ b/pypy/interpreter/generator.py @@ -8,7 +8,7 @@ class GeneratorIterator(Wrappable): "An iterator created by a generator." _immutable_fields_ = ['pycode'] - + def __init__(self, frame): self.space = frame.space self.frame = frame # turned into None when frame_finished_execution @@ -81,7 +81,7 @@ # if the frame is now marked as finished, it was RETURNed from if frame.frame_finished_execution: self.frame = None - raise OperationError(space.w_StopIteration, space.w_None) + raise OperationError(space.w_StopIteration, space.w_None) else: return w_result # YIELDed finally: @@ -97,21 +97,21 @@ def throw(self, w_type, w_val, w_tb): from pypy.interpreter.pytraceback import check_traceback space = self.space - + msg = "throw() third argument must be a traceback object" if space.is_w(w_tb, space.w_None): tb = None else: tb = check_traceback(space, w_tb, msg) - + operr = OperationError(w_type, w_val, tb) operr.normalize_exception(space) return self.send_ex(space.w_None, operr) - + def descr_next(self): """x.next() -> the next value, or raise StopIteration""" return self.send_ex(self.space.w_None) - + def descr_close(self): """x.close(arg) -> raise GeneratorExit inside generator.""" assert isinstance(self, GeneratorIterator) @@ -124,7 +124,7 @@ e.match(space, space.w_GeneratorExit): return space.w_None raise - + if w_retval is not None: msg = "generator ignored GeneratorExit" raise OperationError(space.w_RuntimeError, space.wrap(msg)) @@ -174,7 +174,12 @@ jitdriver.jit_merge_point(self=self, frame=frame, results_w=results_w, pycode=pycode) - w_result = frame.execute_frame(space.w_None) + try: + w_result = frame.execute_frame(space.w_None) + except OperationError, e: + if not e.match(space, space.w_StopIteration): + raise + break # if the frame is now marked as finished, it was RETURNed from if frame.frame_finished_execution: break _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit