Set line number of END_ASYNC_FOR so that it doesn't show in traces. (GH-27255)

This commit is contained in:
Mark Shannon 2021-07-20 11:09:56 +01:00 committed by GitHub
parent 9ee12cf325
commit 7ebd7465a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 0 deletions

View file

@ -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"""

View file

@ -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 */