Skip to content

Commit

Permalink
[3.11] gh-94485: Set line number of module's RESUME instruction to 0 …
Browse files Browse the repository at this point in the history
…as specified by PEP 626 (GH-94552) (GH-94562)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Co-authored-by: Mark Shannon <mark@hotpy.org>

(cherry picked from commit 324d019)
  • Loading branch information
ambv committed Jul 5, 2022
1 parent 0615e7f commit 1bfe83a
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 25 deletions.
5 changes: 3 additions & 2 deletions Lib/importlib/_bootstrap_external.py
Expand Up @@ -402,7 +402,8 @@ def _write_atomic(path, data, mode=0o666):
# add JUMP_BACKWARD_NO_INTERRUPT, make JUMP_NO_INTERRUPT virtual)
# Python 3.11a7 3492 (make POP_JUMP_IF_NONE/NOT_NONE/TRUE/FALSE relative)
# Python 3.11a7 3493 (Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative)
# Python 3.11a7 3494 (New location info table)
# Python 3.11a7 3494 (New location info table)
# Python 3.11b4 3495 (Set line number of module's RESUME instr to 0 per PEP 626)
# Python 3.12 will start with magic number 3500


Expand All @@ -416,7 +417,7 @@ def _write_atomic(path, data, mode=0o666):
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated.

MAGIC_NUMBER = (3494).to_bytes(2, 'little') + b'\r\n'
MAGIC_NUMBER = (3495).to_bytes(2, 'little') + b'\r\n'

_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c

Expand Down
1 change: 0 additions & 1 deletion Lib/test/test_code.py
Expand Up @@ -376,7 +376,6 @@ def test_co_positions_artificial_instructions(self):
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
Expand Down
4 changes: 3 additions & 1 deletion Lib/test/test_compile.py
Expand Up @@ -161,7 +161,7 @@ def test_leading_newlines(self):
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):
Expand Down Expand Up @@ -1054,6 +1054,8 @@ def generic_visit(self, node):

# 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:
Expand Down
18 changes: 9 additions & 9 deletions Lib/test/test_dis.py
Expand Up @@ -272,7 +272,7 @@ def bug42562():
expr_str = "x + 1"

dis_expr_str = """\
RESUME 0
0 RESUME 0
1 LOAD_NAME 0 (x)
LOAD_CONST 0 (1)
Expand All @@ -283,7 +283,7 @@ def bug42562():
simple_stmt_str = "x = x + 1"

dis_simple_stmt_str = """\
RESUME 0
0 RESUME 0
1 LOAD_NAME 0 (x)
LOAD_CONST 0 (1)
Expand All @@ -302,7 +302,7 @@ def bug42562():
# leading newline is for a reason (tests lineno)

dis_annot_stmt_str = """\
RESUME 0
0 RESUME 0
2 SETUP_ANNOTATIONS
LOAD_CONST 0 (1)
Expand Down Expand Up @@ -342,7 +342,7 @@ def bug42562():
# Trailing newline has been deliberately omitted

dis_compound_stmt_str = """\
RESUME 0
0 RESUME 0
1 LOAD_CONST 0 (0)
STORE_NAME 0 (x)
Expand Down Expand Up @@ -954,7 +954,7 @@ def test_super_instructions(self):
@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)
Expand All @@ -972,7 +972,7 @@ def test_binary_specialize(self):
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)
Expand All @@ -992,7 +992,7 @@ def test_binary_specialize(self):
@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__)
Expand All @@ -1006,7 +1006,7 @@ def test_load_attr_specialize(self):
@cpython_only
def test_call_specialize(self):
call_quicken = """\
0 RESUME_QUICK 0
0 0 RESUME_QUICK 0
1 2 PUSH_NULL
4 LOAD_NAME 0 (str)
Expand Down Expand Up @@ -1595,7 +1595,7 @@ def test_co_positions(self):
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),
Expand Down
@@ -0,0 +1,2 @@
Line number of a module's ``RESUME`` instruction is set to 0 as specified in
:pep:`626`.
22 changes: 11 additions & 11 deletions Programs/test_frozenmain.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion Python/compile.c
Expand Up @@ -1803,14 +1803,17 @@ compiler_enter_scope(struct compiler *c, identifier name,
c->u->u_curblock = block;

if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
c->u->u_lineno = -1;
c->u->u_lineno = 0;
}
else {
if (!compiler_set_qualname(c))
return 0;
}
ADDOP_I(c, RESUME, 0);

if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
c->u->u_lineno = -1;
}
return 1;
}

Expand Down

0 comments on commit 1bfe83a

Please sign in to comment.