]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Cleanup cases generator
authorKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Fri, 7 Nov 2025 20:34:49 +0000 (20:34 +0000)
committerKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Fri, 7 Nov 2025 20:34:49 +0000 (20:34 +0000)
Include/internal/pycore_opcode_metadata.h
Python/bytecodes.c
Python/executor_cases.c.h
Tools/cases_generator/analyzer.py
Tools/cases_generator/tier2_generator.py

index 18f8baf980e656659967e44564a6e2fee46870cd..825321739c40c5bde1d66a69fe5039318fa3bb82 100644 (file)
@@ -1189,7 +1189,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
     [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
     [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
     [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
-    [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG },
+    [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [IS_OP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ESCAPES_FLAG },
     [JUMP_BACKWARD] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [JUMP_BACKWARD_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
index dfc7e2952420cdf60e224be118ffcd68a85ca25e..ac308c918d0ffa7a5db420248d834aa2e57c53c0 100644 (file)
@@ -5485,33 +5485,33 @@ dummy_func(
         }
 
         tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
+            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(_PUSH_FRAME);
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
+                frame->instr_ptr += OFFSET_OF(_PUSH_FRAME);
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
+            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(YIELD_VALUE);
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
+                frame->instr_ptr += OFFSET_OF(YIELD_VALUE);
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_RETURN_VALUE, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
+            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(RETURN_VALUE);
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
+                frame->instr_ptr += OFFSET_OF(RETURN_VALUE);
                 EXIT_IF(true);
             }
         }
 
         tier2 op(_GUARD_IP_RETURN_GENERATOR, (ip/4 --)) {
-            _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
+            _Py_CODEUNIT *target = frame->instr_ptr +  OFFSET_OF(RETURN_GENERATOR);
             if (target != (_Py_CODEUNIT *)ip) {
-                frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
+                frame->instr_ptr += OFFSET_OF(RETURN_GENERATOR);
                 EXIT_IF(true);
             }
         }
index 16db3e2efcfc906db908853e9edd476bfa0f7209..84ce8f862a9d2c69bb04d6cf2abe51da81f9243b 100644 (file)
@@ -8,7 +8,6 @@
 #endif
 #define TIER_TWO 2
 
-
         case _NOP: {
             break;
         }
index 5bba28578bfe9296225c6ee2bbbd83aca391ba64..532d5df14f41360e2f141d8db2c5765f71f6a7c7 100644 (file)
@@ -984,7 +984,10 @@ def compute_properties(op: parser.CodeDef) -> Properties:
         no_save_ip=no_save_ip,
         tier=tier_variable(op),
         needs_prev=variable_used(op, "prev_instr"),
-        needs_guard_ip=(isinstance(op, parser.InstDef) and (unpredictable_jump and "replaced" not in op.annotations)) or variable_used(op, "LLTRACE_RESUME_FRAME") or variable_used(op, "DISPATCH_INLINED"),
+        needs_guard_ip=(isinstance(op, parser.InstDef)
+                        and (unpredictable_jump and "replaced" not in op.annotations))
+                       or variable_used(op, "LOAD_IP")
+                       or variable_used(op, "DISPATCH_INLINED"),
         unpredictable_jump=unpredictable_jump,
     )
 
index bff1a4370b48be7b5e6644b0588d3556a27c7c05..b6eab511232e5c64dea6d853112359152afa665d 100644 (file)
@@ -63,7 +63,7 @@ class Tier2Emitter(Emitter):
     def __init__(self, out: CWriter, labels: dict[str, Label]):
         super().__init__(out, labels)
         self._replacers["oparg"] = self.oparg
-        self._replacers["OFFSET_OF_CORRESPONDING_UOP"] = self.offset_of_corresponding_uop
+        self._replacers["OFFSET_OF"] = self.offset_of
 
     def goto_error(self, offset: int, storage: Storage) -> str:
         # To do: Add jump targets for popping values.
@@ -135,7 +135,7 @@ class Tier2Emitter(Emitter):
         self.out.emit_at(uop.name[-1], tkn)
         return True
 
-    def offset_of_corresponding_uop(
+    def offset_of(
         self,
         tkn: Token,
         tkn_iter: TokenIterator,
@@ -144,14 +144,21 @@ class Tier2Emitter(Emitter):
         inst: Instruction | None,
     ) -> bool:
         assert uop.name.startswith("_GUARD_IP")
-        rest = uop.name[len("_GUARD_IP"):]
-        self.emit(f" OFFSET_OF{rest};\n")
+        # LPAREN
+        next(tkn_iter)
+        inst = next(tkn_iter)
+        self.emit(f" OFFSET_OF_{inst.text};\n")
+        # RPAREN
+        next(tkn_iter)
+        # SEMI
         next(tkn_iter)
         return True
 
-def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
+def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]]) -> Stack:
     locals: dict[str, Local] = {}
     try:
+        if name_offset_pair := offset_strs.get(uop.name):
+            emitter.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
         emitter.out.start_line()
         if uop.properties.oparg:
             emitter.emit("oparg = CURRENT_OPARG();\n")
@@ -172,6 +179,8 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
                 idx += 1
         _, storage = emitter.emit_tokens(uop, storage, None, False)
         storage.flush(emitter.out)
+        if name_offset_pair:
+            emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
     except StackError as ex:
         raise analysis_error(ex.args[0], uop.body.open) from None
     return storage.stack
@@ -179,21 +188,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
 SKIPS = ("_EXTENDED_ARG",)
 
 
-def generate_tier2(
-    filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
-) -> None:
-    write_header(__file__, filenames, outfile)
-    outfile.write(
-        """
-#ifdef TIER_ONE
-    #error "This file is for Tier 2 only"
-#endif
-#define TIER_TWO 2
-"""
-    )
-    out = CWriter(outfile, 2, lines)
-    emitter = Tier2Emitter(out, analysis.labels)
-    out.emit("\n")
+def populate_offset_strs(analysis: Analysis) -> dict[str, tuple[str, str]]:
     offset_strs: dict[str, tuple[str, str]] = {}
     for name, uop in analysis.uops.items():
         if not f"_GUARD_IP_{name}" in analysis.uops:
@@ -214,7 +209,23 @@ def generate_tier2(
                 found = True
         assert offset_str
         offset_strs[f"_GUARD_IP_{name}"] = (name, offset_str)
+    return offset_strs
 
+def generate_tier2(
+    filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
+) -> None:
+    write_header(__file__, filenames, outfile)
+    outfile.write(
+        """
+#ifdef TIER_ONE
+    #error "This file is for Tier 2 only"
+#endif
+#define TIER_TWO 2
+"""
+    )
+    out = CWriter(outfile, 2, lines)
+    emitter = Tier2Emitter(out, analysis.labels)
+    offset_strs = populate_offset_strs(analysis)
     out.emit("\n")
 
     for name, uop in analysis.uops.items():
@@ -231,11 +242,7 @@ def generate_tier2(
         out.emit(f"case {uop.name}: {{\n")
         declare_variables(uop, out)
         stack = Stack()
-        if name_offset_pair := offset_strs.get(name):
-            out.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
-        stack = write_uop(uop, emitter, stack)
-        if name_offset_pair:
-            out.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
+        stack = write_uop(uop, emitter, stack, offset_strs)
         out.start_line()
         if not uop.properties.always_exits:
             out.emit("break;\n")