mirror of https://github.com/python/cpython
gh-93061: Mark as artificial: backwards jump after async for (GH-93062) (GH-93110)
(cherry picked from commit a458be3263
)
Co-authored-by: Dennis Sweeney <36520290+sweeneyde@users.noreply.github.com>
This commit is contained in:
parent
96218f774e
commit
f0950585a3
|
@ -609,6 +609,58 @@ class TraceTestCase(unittest.TestCase):
|
||||||
self.compare_events(doit_async.__code__.co_firstlineno,
|
self.compare_events(doit_async.__code__.co_firstlineno,
|
||||||
tracer.events, events)
|
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 test_21_repeated_pass(self):
|
||||||
def func():
|
def func():
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Backward jumps after ``async for`` loops are no longer given dubious line numbers.
|
|
@ -3152,6 +3152,8 @@ compiler_async_for(struct compiler *c, stmt_ty s)
|
||||||
/* Success block for __anext__ */
|
/* Success block for __anext__ */
|
||||||
VISIT(c, expr, s->v.AsyncFor.target);
|
VISIT(c, expr, s->v.AsyncFor.target);
|
||||||
VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
|
VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
|
||||||
|
/* Mark jump as artificial */
|
||||||
|
UNSET_LOC(c);
|
||||||
ADDOP_JUMP(c, JUMP, start);
|
ADDOP_JUMP(c, JUMP, start);
|
||||||
|
|
||||||
compiler_pop_fblock(c, FOR_LOOP, start);
|
compiler_pop_fblock(c, FOR_LOOP, start);
|
||||||
|
|
Loading…
Reference in New Issue