[Python-checkins] gh-93061: Mark as artificial: backwards jump after async for (GH-93062)
markshannon
webhook-mailer at python.org
Mon May 23 08:58:50 EDT 2022
https://github.com/python/cpython/commit/a458be3263b4cb92f3fde726461e8ef44b2a4a9d
commit: a458be3263b4cb92f3fde726461e8ef44b2a4a9d
branch: main
author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com>
committer: markshannon <mark at hotpy.org>
date: 2022-05-23T13:58:41+01:00
summary:
gh-93061: Mark as artificial: backwards jump after async for (GH-93062)
files:
A Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst
M Lib/test/test_sys_settrace.py
M Python/compile.c
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index 9cc6bcfcab5e1..162fd8328582c 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -609,6 +609,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
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst
new file mode 100644
index 0000000000000..d41e59028ad57
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst
@@ -0,0 +1 @@
+Backward jumps after ``async for`` loops are no longer given dubious line numbers.
diff --git a/Python/compile.c b/Python/compile.c
index c862c10a83e53..a4738c1f48f2a 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3148,6 +3148,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 */
+ UNSET_LOC(c);
ADDOP_JUMP(c, JUMP, start);
compiler_pop_fblock(c, FOR_LOOP, start);
More information about the Python-checkins
mailing list