]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-98831: Clean up and add cache size static_assert to macro (#101442)
authorGuido van Rossum <guido@python.org>
Tue, 31 Jan 2023 01:27:51 +0000 (17:27 -0800)
committerGitHub <noreply@github.com>
Tue, 31 Jan 2023 01:27:51 +0000 (17:27 -0800)
Tools/cases_generator/generate_cases.py
Tools/cases_generator/test_generator.py

index f0c5f96733fe62d2569c72db52fca14d855dae5c..43685450cc0dfe1e57fd8c6be9b8d3ae98635fd2 100644 (file)
@@ -597,7 +597,7 @@ class Analyzer:
                         self.error(
                             f"Instruction {member} is a member of multiple families "
                             f"({member_instr.family.name}, {family.name}).",
-                            family
+                            family,
                         )
                     else:
                         member_instr.family = family
@@ -609,7 +609,7 @@ class Analyzer:
                                     f"Component {part.instr.name} of macro {member} "
                                     f"is a member of multiple families "
                                     f"({part.instr.family.name}, {family.name}).",
-                                    family
+                                    family,
                                 )
                             else:
                                 part.instr.family = family
@@ -629,7 +629,11 @@ class Analyzer:
         for family in self.families.values():
             if len(family.members) < 2:
                 self.error(f"Family {family.name!r} has insufficient members", family)
-            members = [member for member in family.members if member in self.instrs or member in self.macro_instrs]
+            members = [
+                member
+                for member in family.members
+                if member in self.instrs or member in self.macro_instrs
+            ]
             if members != family.members:
                 unknown = set(family.members) - set(members)
                 self.error(
@@ -859,7 +863,9 @@ class Analyzer:
                 popped_data.append((instr, popped))
                 pushed_data.append((instr, pushed))
 
-        def write_function(direction: str, data: list[tuple[AnyInstruction, str]]) -> None:
+        def write_function(
+            direction: str, data: list[tuple[AnyInstruction, str]]
+        ) -> None:
             self.out.emit("\n#ifndef NDEBUG")
             self.out.emit("static int")
             self.out.emit(f"_PyOpcode_num_{direction}(int opcode, int oparg) {{")
@@ -1031,6 +1037,7 @@ class Analyzer:
 
     def write_macro(self, mac: MacroInstruction) -> None:
         """Write code for a macro instruction."""
+        last_instr: Instruction | None = None
         with self.wrap_super_or_macro(mac):
             cache_adjust = 0
             for part in mac.parts:
@@ -1038,12 +1045,24 @@ class Analyzer:
                     case parser.CacheEffect(size=size):
                         cache_adjust += size
                     case Component() as comp:
+                        last_instr = comp.instr
                         comp.write_body(self.out, cache_adjust)
                         cache_adjust += comp.instr.cache_offset
 
             if cache_adjust:
                 self.out.emit(f"JUMPBY({cache_adjust});")
 
+            if (
+                last_instr
+                and (family := last_instr.family)
+                and mac.name == family.members[0]
+                and (cache_size := family.size)
+            ):
+                self.out.emit(
+                    f"static_assert({cache_size} == "
+                    f'{cache_adjust}, "incorrect cache size");'
+                )
+
     @contextlib.contextmanager
     def wrap_super_or_macro(self, up: SuperOrMacroInstruction):
         """Shared boilerplate for super- and macro instructions."""
index 49a99377fc04c80b52644288def20823a1f3bf41..9df97d24ab6f43aec636a299ca1306b530e7b88a 100644 (file)
@@ -383,6 +383,7 @@ def test_macro_instruction():
                 _tmp_3 = res;
             }
             JUMPBY(5);
+            static_assert(INLINE_CACHE_ENTRIES_OP == 5, "incorrect cache size");
             STACK_SHRINK(2);
             POKE(1, _tmp_3);
             DISPATCH();