gh-94485: Set line number of module's RESUME instruction to 0, as specified by PEP 626 (GH-94552)

Co-authored-by: Mark Shannon <mark@hotpy.org>
This commit is contained in:
Irit Katriel 2022-07-05 13:38:44 +01:00 committed by GitHub
parent a2a3f2c541
commit 324d01944d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 26 deletions

View File

@ -410,6 +410,7 @@ _code_type = type(_write_atomic.__code__)
# Python 3.12a1 3504 (Merge LOAD_METHOD back into LOAD_ATTR) # Python 3.12a1 3504 (Merge LOAD_METHOD back into LOAD_ATTR)
# Python 3.12a1 3505 (Specialization/Cache for FOR_ITER) # Python 3.12a1 3505 (Specialization/Cache for FOR_ITER)
# Python 3.12a1 3506 (Add BINARY_SLICE and STORE_SLICE instructions) # Python 3.12a1 3506 (Add BINARY_SLICE and STORE_SLICE instructions)
# Python 3.12a1 3507 (Set lineno of module's RESUME to 0)
# Python 3.13 will start with 3550 # Python 3.13 will start with 3550
@ -423,7 +424,7 @@ _code_type = type(_write_atomic.__code__)
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated. # in PC/launcher.c must also be updated.
MAGIC_NUMBER = (3506).to_bytes(2, 'little') + b'\r\n' MAGIC_NUMBER = (3507).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c

View File

@ -376,7 +376,6 @@ class CodeTest(unittest.TestCase):
for instruction in artificial_instructions for instruction in artificial_instructions
], ],
[ [
('RESUME', 0),
("PUSH_EXC_INFO", None), ("PUSH_EXC_INFO", None),
("LOAD_CONST", None), # artificial 'None' ("LOAD_CONST", None), # artificial 'None'
("STORE_NAME", "e"), # XX: we know the location for this ("STORE_NAME", "e"), # XX: we know the location for this

View File

@ -161,7 +161,7 @@ if 1:
co = compile(s256, 'fn', 'exec') co = compile(s256, 'fn', 'exec')
self.assertEqual(co.co_firstlineno, 1) self.assertEqual(co.co_firstlineno, 1)
lines = list(co.co_lines()) lines = list(co.co_lines())
self.assertEqual(lines[0][2], None) self.assertEqual(lines[0][2], 0)
self.assertEqual(lines[1][2], 257) self.assertEqual(lines[1][2], 257)
def test_literals_with_leading_zeroes(self): def test_literals_with_leading_zeroes(self):
@ -1032,8 +1032,8 @@ if 1:
def check_op_count(func, op, expected): def check_op_count(func, op, expected):
actual = 0 actual = 0
for instr in dis.Bytecode(func): for instr in dis.Bytecode(func):
if instr.opname == op: if instr.opname == op:
actual += 1 actual += 1
self.assertEqual(actual, expected) self.assertEqual(actual, expected)
def load(): def load():
@ -1090,6 +1090,8 @@ class TestSourcePositions(unittest.TestCase):
# Check against the positions in the code object. # Check against the positions in the code object.
for (line, end_line, col, end_col) in code.co_positions(): for (line, end_line, col, end_col) in code.co_positions():
if line == 0:
continue # This is an artificial module-start line
# If the offset is not None (indicating missing data), ensure that # If the offset is not None (indicating missing data), ensure that
# it was part of one of the AST nodes. # it was part of one of the AST nodes.
if line is not None: if line is not None:

View File

@ -267,7 +267,7 @@ Disassembly of g:
expr_str = "x + 1" expr_str = "x + 1"
dis_expr_str = """\ dis_expr_str = """\
RESUME 0 0 RESUME 0
1 LOAD_NAME 0 (x) 1 LOAD_NAME 0 (x)
LOAD_CONST 0 (1) LOAD_CONST 0 (1)
@ -278,7 +278,7 @@ dis_expr_str = """\
simple_stmt_str = "x = x + 1" simple_stmt_str = "x = x + 1"
dis_simple_stmt_str = """\ dis_simple_stmt_str = """\
RESUME 0 0 RESUME 0
1 LOAD_NAME 0 (x) 1 LOAD_NAME 0 (x)
LOAD_CONST 0 (1) LOAD_CONST 0 (1)
@ -297,7 +297,7 @@ lst[fun(0)]: int = 1
# leading newline is for a reason (tests lineno) # leading newline is for a reason (tests lineno)
dis_annot_stmt_str = """\ dis_annot_stmt_str = """\
RESUME 0 0 RESUME 0
2 SETUP_ANNOTATIONS 2 SETUP_ANNOTATIONS
LOAD_CONST 0 (1) LOAD_CONST 0 (1)
@ -335,7 +335,7 @@ while 1:
# Trailing newline has been deliberately omitted # Trailing newline has been deliberately omitted
dis_compound_stmt_str = """\ dis_compound_stmt_str = """\
RESUME 0 0 RESUME 0
1 LOAD_CONST 0 (0) 1 LOAD_CONST 0 (0)
STORE_NAME 0 (x) STORE_NAME 0 (x)
@ -1092,7 +1092,7 @@ class DisTests(DisTestBase):
@cpython_only @cpython_only
def test_binary_specialize(self): def test_binary_specialize(self):
binary_op_quicken = """\ binary_op_quicken = """\
0 RESUME_QUICK 0 0 0 RESUME_QUICK 0
1 2 LOAD_NAME 0 (a) 1 2 LOAD_NAME 0 (a)
4 LOAD_NAME 1 (b) 4 LOAD_NAME 1 (b)
@ -1110,7 +1110,7 @@ class DisTests(DisTestBase):
self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE 0 (+)", True) self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE 0 (+)", True)
binary_subscr_quicken = """\ binary_subscr_quicken = """\
0 RESUME_QUICK 0 0 0 RESUME_QUICK 0
1 2 LOAD_NAME 0 (a) 1 2 LOAD_NAME 0 (a)
4 LOAD_CONST 0 (0) 4 LOAD_CONST 0 (0)
@ -1130,7 +1130,7 @@ class DisTests(DisTestBase):
@cpython_only @cpython_only
def test_load_attr_specialize(self): def test_load_attr_specialize(self):
load_attr_quicken = """\ load_attr_quicken = """\
0 RESUME_QUICK 0 0 0 RESUME_QUICK 0
1 2 LOAD_CONST 0 ('a') 1 2 LOAD_CONST 0 ('a')
4 LOAD_ATTR_SLOT 0 (__class__) 4 LOAD_ATTR_SLOT 0 (__class__)
@ -1144,7 +1144,7 @@ class DisTests(DisTestBase):
@cpython_only @cpython_only
def test_call_specialize(self): def test_call_specialize(self):
call_quicken = """\ call_quicken = """\
RESUME_QUICK 0 0 RESUME_QUICK 0
1 PUSH_NULL 1 PUSH_NULL
LOAD_NAME 0 (str) LOAD_NAME 0 (str)
@ -1718,7 +1718,7 @@ class InstructionTests(InstructionTestCase):
for instr in dis.get_instructions(code) for instr in dis.get_instructions(code)
] ]
expected = [ expected = [
(None, None, None, None), (0, 1, 0, 0),
(1, 1, 0, 1), (1, 1, 0, 1),
(1, 1, 0, 1), (1, 1, 0, 1),
(2, 2, 2, 3), (2, 2, 2, 3),

View File

@ -0,0 +1,2 @@
Line number of a module's ``RESUME`` instruction is set to 0 as specified in
:pep:`626`.

View File

@ -28,15 +28,15 @@ unsigned char M_test_frozenmain[] = {
3,0,0,0,218,3,107,101,121,169,0,243,0,0,0,0, 3,0,0,0,218,3,107,101,121,169,0,243,0,0,0,0,
250,18,116,101,115,116,95,102,114,111,122,101,110,109,97,105, 250,18,116,101,115,116,95,102,114,111,122,101,110,109,97,105,
110,46,112,121,250,8,60,109,111,100,117,108,101,62,114,18, 110,46,112,121,250,8,60,109,111,100,117,108,101,62,114,18,
0,0,0,1,0,0,0,115,145,0,0,0,248,240,6,0, 0,0,0,1,0,0,0,115,149,0,0,0,240,3,1,1,
1,11,128,10,128,10,128,10,216,0,24,208,0,24,208,0, 1,240,8,0,1,11,128,10,128,10,128,10,216,0,24,208,
24,208,0,24,224,0,5,128,5,208,6,26,212,0,27,208, 0,24,208,0,24,208,0,24,224,0,5,128,5,208,6,26,
0,27,216,0,5,128,5,128,106,144,35,151,40,145,40,212, 212,0,27,208,0,27,216,0,5,128,5,128,106,144,35,151,
0,27,208,0,27,216,9,38,208,9,26,215,9,38,209,9, 40,145,40,212,0,27,208,0,27,216,9,38,208,9,26,215,
38,212,9,40,168,24,212,9,50,128,6,240,2,6,12,2, 9,38,209,9,38,212,9,40,168,24,212,9,50,128,6,240,
240,0,7,1,42,241,0,7,1,42,128,67,240,14,0,5, 2,6,12,2,240,0,7,1,42,241,0,7,1,42,128,67,
10,128,69,208,10,40,144,67,208,10,40,208,10,40,152,54, 240,14,0,5,10,128,69,208,10,40,144,67,208,10,40,208,
160,35,156,59,208,10,40,208,10,40,212,4,41,208,4,41, 10,40,152,54,160,35,156,59,208,10,40,208,10,40,212,4,
208,4,41,240,15,7,1,42,240,0,7,1,42,114,16,0, 41,208,4,41,208,4,41,240,15,7,1,42,240,0,7,1,
0,0, 42,114,16,0,0,0,
}; };

View File

@ -1759,7 +1759,7 @@ compiler_enter_scope(struct compiler *c, identifier name,
c->u->u_curblock = block; c->u->u_curblock = block;
if (u->u_scope_type == COMPILER_SCOPE_MODULE) { if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
c->u->u_loc.lineno = -1; c->u->u_loc.lineno = 0;
} }
else { else {
if (!compiler_set_qualname(c)) if (!compiler_set_qualname(c))
@ -1767,6 +1767,9 @@ compiler_enter_scope(struct compiler *c, identifier name,
} }
ADDOP_I(c, RESUME, 0); ADDOP_I(c, RESUME, 0);
if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
c->u->u_loc.lineno = -1;
}
return 1; return 1;
} }