mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
[3.11] GH-91409: Don't overwrite valid locations with NOP locations (GH-95067) (GH-95068)
(cherry picked from commit 742d4614e1
)
This commit is contained in:
parent
6515738c0e
commit
e2fce3a8e7
3 changed files with 44 additions and 1 deletions
|
@ -1166,6 +1166,44 @@ f(
|
||||||
tree.body[0] = new_node
|
tree.body[0] = new_node
|
||||||
compile(tree, "<test>", "exec")
|
compile(tree, "<test>", "exec")
|
||||||
|
|
||||||
|
def test_push_null_load_global_positions(self):
|
||||||
|
source_template = """
|
||||||
|
import abc, dis
|
||||||
|
import ast as art
|
||||||
|
|
||||||
|
abc = None
|
||||||
|
dix = dis
|
||||||
|
ast = art
|
||||||
|
|
||||||
|
def f():
|
||||||
|
{}
|
||||||
|
"""
|
||||||
|
for body in [
|
||||||
|
" abc.a()",
|
||||||
|
" art.a()",
|
||||||
|
" ast.a()",
|
||||||
|
" dis.a()",
|
||||||
|
" dix.a()",
|
||||||
|
" abc[...]()",
|
||||||
|
" art()()",
|
||||||
|
" (ast or ...)()",
|
||||||
|
" [dis]()",
|
||||||
|
" (dix + ...)()",
|
||||||
|
]:
|
||||||
|
with self.subTest(body):
|
||||||
|
namespace = {}
|
||||||
|
source = textwrap.dedent(source_template.format(body))
|
||||||
|
exec(source, namespace)
|
||||||
|
code = namespace["f"].__code__
|
||||||
|
self.assertOpcodeSourcePositionIs(
|
||||||
|
code,
|
||||||
|
"LOAD_GLOBAL",
|
||||||
|
line=10,
|
||||||
|
end_line=10,
|
||||||
|
column=4,
|
||||||
|
end_column=7,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestExpressionStackSize(unittest.TestCase):
|
class TestExpressionStackSize(unittest.TestCase):
|
||||||
# These tests check that the computed stack size for a code object
|
# These tests check that the computed stack size for a code object
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix incorrect source location info caused by certain optimizations in the
|
||||||
|
bytecode compiler.
|
|
@ -9045,7 +9045,10 @@ clean_basic_block(basicblock *bb) {
|
||||||
/* or, if the next instruction has same line number or no line number */
|
/* or, if the next instruction has same line number or no line number */
|
||||||
if (src < bb->b_iused - 1) {
|
if (src < bb->b_iused - 1) {
|
||||||
int next_lineno = bb->b_instr[src+1].i_lineno;
|
int next_lineno = bb->b_instr[src+1].i_lineno;
|
||||||
if (next_lineno < 0 || next_lineno == lineno) {
|
if (next_lineno == lineno) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (next_lineno < 0) {
|
||||||
COPY_INSTR_LOC(bb->b_instr[src], bb->b_instr[src+1]);
|
COPY_INSTR_LOC(bb->b_instr[src], bb->b_instr[src+1]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue