mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
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:
parent
a2a3f2c541
commit
324d01944d
7 changed files with 33 additions and 26 deletions
|
|
@ -410,6 +410,7 @@ _code_type = type(_write_atomic.__code__)
|
|||
# Python 3.12a1 3504 (Merge LOAD_METHOD back into LOAD_ATTR)
|
||||
# Python 3.12a1 3505 (Specialization/Cache for FOR_ITER)
|
||||
# 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
|
||||
|
||||
|
|
@ -423,7 +424,7 @@ _code_type = type(_write_atomic.__code__)
|
|||
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
|
||||
# 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
|
||||
|
||||
|
|
|
|||
|
|
@ -376,7 +376,6 @@ class CodeTest(unittest.TestCase):
|
|||
for instruction in artificial_instructions
|
||||
],
|
||||
[
|
||||
('RESUME', 0),
|
||||
("PUSH_EXC_INFO", None),
|
||||
("LOAD_CONST", None), # artificial 'None'
|
||||
("STORE_NAME", "e"), # XX: we know the location for this
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ if 1:
|
|||
co = compile(s256, 'fn', 'exec')
|
||||
self.assertEqual(co.co_firstlineno, 1)
|
||||
lines = list(co.co_lines())
|
||||
self.assertEqual(lines[0][2], None)
|
||||
self.assertEqual(lines[0][2], 0)
|
||||
self.assertEqual(lines[1][2], 257)
|
||||
|
||||
def test_literals_with_leading_zeroes(self):
|
||||
|
|
@ -1032,8 +1032,8 @@ if 1:
|
|||
def check_op_count(func, op, expected):
|
||||
actual = 0
|
||||
for instr in dis.Bytecode(func):
|
||||
if instr.opname == op:
|
||||
actual += 1
|
||||
if instr.opname == op:
|
||||
actual += 1
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def load():
|
||||
|
|
@ -1090,6 +1090,8 @@ class TestSourcePositions(unittest.TestCase):
|
|||
|
||||
# Check against the positions in the code object.
|
||||
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
|
||||
# it was part of one of the AST nodes.
|
||||
if line is not None:
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ Disassembly of g:
|
|||
expr_str = "x + 1"
|
||||
|
||||
dis_expr_str = """\
|
||||
RESUME 0
|
||||
0 RESUME 0
|
||||
|
||||
1 LOAD_NAME 0 (x)
|
||||
LOAD_CONST 0 (1)
|
||||
|
|
@ -278,7 +278,7 @@ dis_expr_str = """\
|
|||
simple_stmt_str = "x = x + 1"
|
||||
|
||||
dis_simple_stmt_str = """\
|
||||
RESUME 0
|
||||
0 RESUME 0
|
||||
|
||||
1 LOAD_NAME 0 (x)
|
||||
LOAD_CONST 0 (1)
|
||||
|
|
@ -297,7 +297,7 @@ lst[fun(0)]: int = 1
|
|||
# leading newline is for a reason (tests lineno)
|
||||
|
||||
dis_annot_stmt_str = """\
|
||||
RESUME 0
|
||||
0 RESUME 0
|
||||
|
||||
2 SETUP_ANNOTATIONS
|
||||
LOAD_CONST 0 (1)
|
||||
|
|
@ -335,7 +335,7 @@ while 1:
|
|||
# Trailing newline has been deliberately omitted
|
||||
|
||||
dis_compound_stmt_str = """\
|
||||
RESUME 0
|
||||
0 RESUME 0
|
||||
|
||||
1 LOAD_CONST 0 (0)
|
||||
STORE_NAME 0 (x)
|
||||
|
|
@ -1092,7 +1092,7 @@ class DisTests(DisTestBase):
|
|||
@cpython_only
|
||||
def test_binary_specialize(self):
|
||||
binary_op_quicken = """\
|
||||
0 RESUME_QUICK 0
|
||||
0 0 RESUME_QUICK 0
|
||||
|
||||
1 2 LOAD_NAME 0 (a)
|
||||
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)
|
||||
|
||||
binary_subscr_quicken = """\
|
||||
0 RESUME_QUICK 0
|
||||
0 0 RESUME_QUICK 0
|
||||
|
||||
1 2 LOAD_NAME 0 (a)
|
||||
4 LOAD_CONST 0 (0)
|
||||
|
|
@ -1130,7 +1130,7 @@ class DisTests(DisTestBase):
|
|||
@cpython_only
|
||||
def test_load_attr_specialize(self):
|
||||
load_attr_quicken = """\
|
||||
0 RESUME_QUICK 0
|
||||
0 0 RESUME_QUICK 0
|
||||
|
||||
1 2 LOAD_CONST 0 ('a')
|
||||
4 LOAD_ATTR_SLOT 0 (__class__)
|
||||
|
|
@ -1144,7 +1144,7 @@ class DisTests(DisTestBase):
|
|||
@cpython_only
|
||||
def test_call_specialize(self):
|
||||
call_quicken = """\
|
||||
RESUME_QUICK 0
|
||||
0 RESUME_QUICK 0
|
||||
|
||||
1 PUSH_NULL
|
||||
LOAD_NAME 0 (str)
|
||||
|
|
@ -1718,7 +1718,7 @@ class InstructionTests(InstructionTestCase):
|
|||
for instr in dis.get_instructions(code)
|
||||
]
|
||||
expected = [
|
||||
(None, None, None, None),
|
||||
(0, 1, 0, 0),
|
||||
(1, 1, 0, 1),
|
||||
(1, 1, 0, 1),
|
||||
(2, 2, 2, 3),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue