mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Set line number of END_ASYNC_FOR so that it doesn't show in traces. (GH-27255)
This commit is contained in:
parent
9ee12cf325
commit
7ebd7465a5
2 changed files with 50 additions and 0 deletions
|
@ -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"""
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue