Skip to content

Commit

Permalink
gh-93061: Mark as artificial: backwards jump after async for (GH-93120)
Browse files Browse the repository at this point in the history
  • Loading branch information
sweeneyde committed May 23, 2022
1 parent 251104f commit c1b1249
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
52 changes: 52 additions & 0 deletions Lib/test/test_sys_settrace.py
Expand Up @@ -607,6 +607,58 @@ def run(tracer):
self.compare_events(doit_async.__code__.co_firstlineno,
tracer.events, events)

def test_async_for_backwards_jump_has_no_line(self):
async def arange(n):
for i in range(n):
yield i
async def f():
async for i in arange(3):
if i > 100:
break # should never be traced

tracer = self.make_tracer()
coro = f()
try:
sys.settrace(tracer.trace)
coro.send(None)
except Exception:
pass
finally:
sys.settrace(None)

events = [
(0, 'call'),
(1, 'line'),
(-3, 'call'),
(-2, 'line'),
(-1, 'line'),
(-1, 'return'),
(1, 'exception'),
(2, 'line'),
(1, 'line'),
(-1, 'call'),
(-2, 'line'),
(-1, 'line'),
(-1, 'return'),
(1, 'exception'),
(2, 'line'),
(1, 'line'),
(-1, 'call'),
(-2, 'line'),
(-1, 'line'),
(-1, 'return'),
(1, 'exception'),
(2, 'line'),
(1, 'line'),
(-1, 'call'),
(-2, 'line'),
(-2, 'return'),
(1, 'exception'),
(1, 'return'),
]
self.compare_events(f.__code__.co_firstlineno,
tracer.events, events)

def test_21_repeated_pass(self):
def func():
pass
Expand Down
@@ -0,0 +1 @@
Backward jumps after ``async for`` loops are no longer given dubious line numbers.
2 changes: 2 additions & 0 deletions Python/compile.c
Expand Up @@ -2925,6 +2925,8 @@ compiler_async_for(struct compiler *c, stmt_ty s)
/* Success block for __anext__ */
VISIT(c, expr, s->v.AsyncFor.target);
VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
/* Mark jump as artificial */
c->u->u_lineno = -1;
ADDOP_JUMP(c, JUMP_ABSOLUTE, start);

compiler_pop_fblock(c, FOR_LOOP, start);
Expand Down

0 comments on commit c1b1249

Please sign in to comment.