From 1cbf607d944f8fadbcac94d287a7fcffae613c21 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 26 Sep 2023 21:25:36 +0100 Subject: [PATCH] gh-109923: set line number on the POP_TOP that follows a RETURN_GENERATOR --- Lib/test/test_dis.py | 14 ++++---------- Python/flowgraph.c | 6 ++++-- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index d104e5dd904999e..8ab0e1ecbc4a7f7 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -524,10 +524,8 @@ async def _asyncwith(c): dis_asyncwith = """\ %4d RETURN_GENERATOR - -None POP_TOP - -%4d RESUME 0 + POP_TOP + RESUME 0 %4d LOAD_FAST 0 (c) BEFORE_ASYNC_WITH @@ -598,7 +596,6 @@ async def _asyncwith(c): ExceptionTable: 12 rows """ % (_asyncwith.__code__.co_firstlineno, - _asyncwith.__code__.co_firstlineno, _asyncwith.__code__.co_firstlineno + 1, _asyncwith.__code__.co_firstlineno + 2, _asyncwith.__code__.co_firstlineno + 1, @@ -757,10 +754,8 @@ def foo(x): None COPY_FREE_VARS 1 %4d RETURN_GENERATOR - -None POP_TOP - -%4d RESUME 0 + POP_TOP + RESUME 0 LOAD_FAST 0 (.0) >> FOR_ITER 10 (to 34) STORE_FAST 1 (z) @@ -782,7 +777,6 @@ def foo(x): __file__, _h.__code__.co_firstlineno + 3, _h.__code__.co_firstlineno + 3, - _h.__code__.co_firstlineno + 3, ) def load_test(x, y=0): diff --git a/Python/flowgraph.c b/Python/flowgraph.c index adfcef33895a538..d3570406e501073 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -2461,17 +2461,19 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata *umd, basicblock *entrybl * of 0. This is because RETURN_GENERATOR pushes an element * with _PyFrame_StackPush before switching stacks. */ + + location loc = LOCATION(umd->u_firstlineno, umd->u_firstlineno, -1, -1); cfg_instr make_gen = { .i_opcode = RETURN_GENERATOR, .i_oparg = 0, - .i_loc = LOCATION(umd->u_firstlineno, umd->u_firstlineno, -1, -1), + .i_loc = loc, .i_target = NULL, }; RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0, &make_gen)); cfg_instr pop_top = { .i_opcode = POP_TOP, .i_oparg = 0, - .i_loc = NO_LOCATION, + .i_loc = loc, .i_target = NULL, }; RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 1, &pop_top));