]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46724: Use `JUMP_ABSOLUTE` for all backward jumps. (GH-31326)
authorMark Shannon <mark@hotpy.org>
Tue, 15 Feb 2022 09:35:16 +0000 (09:35 +0000)
committerGitHub <noreply@github.com>
Tue, 15 Feb 2022 09:35:16 +0000 (09:35 +0000)
* Make sure all backward jumps use JUMP_ABSOLUTE.

* Add news.

* Fix up news item.

* Make test use consistent style.

Lib/test/test_compile.py
Misc/NEWS.d/next/Core and Builtins/2022-02-14-14-44-06.bpo-46724.jym_K6.rst [new file with mode: 0644]
Python/compile.c

index 096501513c14bbc221a07028b7a01fc3bf14ef27..7ebe837fce1b51f6a6ec024af78042f23ea8d64c 100644 (file)
@@ -1008,6 +1008,16 @@ if 1:
             elif instr.opname in HANDLED_JUMPS:
                 self.assertNotEqual(instr.arg, (line + 1)*INSTR_SIZE)
 
+    def test_no_wraparound_jump(self):
+        # See https://bugs.python.org/issue46724
+
+        def while_not_chained(a, b, c):
+            while not (a < b < c):
+                pass
+
+        for instr in dis.Bytecode(while_not_chained):
+            self.assertNotEqual(instr.opname, "EXTENDED_ARG")
+
 @requires_debug_ranges()
 class TestSourcePositions(unittest.TestCase):
     # Ensure that compiled code snippets have correct line and column numbers
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-14-14-44-06.bpo-46724.jym_K6.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-14-14-44-06.bpo-46724.jym_K6.rst
new file mode 100644 (file)
index 0000000..7324182
--- /dev/null
@@ -0,0 +1,2 @@
+Make sure that all backwards jumps use the ``JUMP_ABSOLUTE`` instruction, rather
+than ``JUMP_FORWARD`` with an argument of ``(2**32)+offset``.
index 1cf20d3a36ac116b037ad1f0dffdd07b17b17a79..786ef4e8ad3e28432dfc21ebe9557b98d44e6024 100644 (file)
@@ -7534,6 +7534,11 @@ normalize_jumps(struct assembler *a)
                 last->i_opcode = JUMP_FORWARD;
             }
         }
+        if (last->i_opcode == JUMP_FORWARD) {
+            if (last->i_target->b_visited == 1) {
+                last->i_opcode = JUMP_ABSOLUTE;
+            }
+        }
     }
 }