From: Mark Shannon Date: Tue, 20 Jul 2021 10:09:56 +0000 (+0100) Subject: Set line number of END_ASYNC_FOR so that it doesn't show in traces. (GH-27255) X-Git-Tag: v3.9.7~145 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7ebd7465a5a6a5955fbf69316e1bc8b05cd6fbed;p=thirdparty%2FPython%2Fcpython.git Set line number of END_ASYNC_FOR so that it doesn't show in traces. (GH-27255) --- diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 482e918acac5..7519309c5e58 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -602,6 +602,50 @@ class TraceTestCase(unittest.TestCase): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_21_async_for_else(self): + + async def async_gen(): + yield -2 + + async def async_test(): + global a + a = 2 + async for i in async_gen(): + a = 4 + else: + a = 6 + + def run(tracer): + x = async_test() + try: + sys.settrace(tracer) + x.send(None) + finally: + sys.settrace(None) + + tracer = self.make_tracer() + events = [ + (0, 'call'), + (2, 'line'), + (3, 'line'), + (-3, 'call'), + (-2, 'line'), + (-2, 'return'), + (3, 'exception'), + (4, 'line'), + (3, 'line'), + (-2, 'call'), + (-2, 'return'), + (3, 'exception'), + (6, 'line'), + (6, 'return')] + try: + run(tracer.trace) + except Exception: + pass + self.compare_events(async_test.__code__.co_firstlineno, + tracer.events, events) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Python/compile.c b/Python/compile.c index 722d52dbcefb..f426050ccef5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2816,6 +2816,12 @@ compiler_async_for(struct compiler *c, stmt_ty s) /* Except block for __anext__ */ compiler_use_next_block(c, except); + + /* We don't want to trace the END_ASYNC_FOR, so make sure + * that it has the same lineno as the following instruction. */ + if (asdl_seq_LEN(s->v.For.orelse)) { + SET_LOC(c, (stmt_ty)asdl_seq_GET(s->v.For.orelse, 0)); + } ADDOP(c, END_ASYNC_FOR); /* `else` block */