mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +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,
|
self.compare_events(doit_async.__code__.co_firstlineno,
|
||||||
tracer.events, events)
|
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):
|
class SkipLineEventsTraceTestCase(TraceTestCase):
|
||||||
"""Repeat the trace tests, but with per-line events skipped"""
|
"""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__ */
|
/* Except block for __anext__ */
|
||||||
compiler_use_next_block(c, except);
|
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);
|
ADDOP(c, END_ASYNC_FOR);
|
||||||
|
|
||||||
/* `else` block */
|
/* `else` block */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue