Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r89019:d05548c7343d Date: 2016-12-12 14:02 +0100 http://bitbucket.org/pypy/pypy/changeset/d05548c7343d/
Log: Test and fix for a similar exception_trace() inside YIELD_FROM diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py --- a/pypy/interpreter/generator.py +++ b/pypy/interpreter/generator.py @@ -185,6 +185,7 @@ if not e.match(space, space.w_StopIteration): raise e.normalize_exception(space) + space.getexecutioncontext().exception_trace(frame, e) try: w_stop_value = space.getattr(e.get_w_value(space), space.wrap("value")) diff --git a/pypy/interpreter/test/test_pyframe.py b/pypy/interpreter/test/test_pyframe.py --- a/pypy/interpreter/test/test_pyframe.py +++ b/pypy/interpreter/test/test_pyframe.py @@ -652,9 +652,11 @@ gen = f() assert next(gen) == 5 seen = [] + frames = [] def trace_func(frame, event, *args): print('TRACE:', frame, event, args) seen.append(event) + frames.append(frame) return trace_func def g(): for x in gen: @@ -666,6 +668,63 @@ # on Python 3 we get an extra 'exception' when 'for' catches # StopIteration assert seen == ['call', 'line', 'call', 'return', 'exception', 'return'] + assert frames[-2].f_code.co_name == 'g' + + def test_yieldfrom_trace_stopiteration(self): """ + import sys + def f2(): + yield 5 + def f(): + yield from f2() + gen = f() + assert next(gen) == 5 + seen = [] + frames = [] + def trace_func(frame, event, *args): + print('TRACE:', frame, event, args) + seen.append(event) + frames.append(frame) + return trace_func + def g(): + for x in gen: + never_entered + sys.settrace(trace_func) + g() # invokes next_yield_from() from resume_execute_frame() + sys.settrace(None) + print('seen:', seen) + assert seen == ['call', 'line', 'call', 'call', 'return', + 'exception', 'return', 'exception', 'return'] + assert frames[-4].f_code.co_name == 'f' + assert frames[-2].f_code.co_name == 'g' + """ + + def test_yieldfrom_trace_stopiteration_2(self): """ + import sys + def f2(): + if False: + yield 5 + def f(): + yield from f2() + gen = f() + seen = [] + frames = [] + def trace_func(frame, event, *args): + print('TRACE:', frame, event, args) + seen.append(event) + frames.append(frame) + return trace_func + def g(): + for x in gen: + never_entered + sys.settrace(trace_func) + g() # invokes next_yield_from() from YIELD_FROM() + sys.settrace(None) + print('seen:', seen) + assert seen == ['call', 'line', 'call', 'line', 'call', 'line', + 'return', 'exception', 'return', 'exception', 'return'] + assert frames[-4].f_code.co_name == 'f' + assert frames[-2].f_code.co_name == 'g' + """ def test_clear_locals(self): def make_frames(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit