Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 04ab767

Browse files
authored
gh-98831: Clean up and add cache size static_assert to macro (#101442)
1 parent af7b2db commit 04ab767

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

Tools/cases_generator/generate_cases.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ def map_families(self) -> None:
597597
self.error(
598598
f"Instruction {member} is a member of multiple families "
599599
f"({member_instr.family.name}, {family.name}).",
600-
family
600+
family,
601601
)
602602
else:
603603
member_instr.family = family
@@ -609,7 +609,7 @@ def map_families(self) -> None:
609609
f"Component {part.instr.name} of macro {member} "
610610
f"is a member of multiple families "
611611
f"({part.instr.family.name}, {family.name}).",
612-
family
612+
family,
613613
)
614614
else:
615615
part.instr.family = family
@@ -629,7 +629,11 @@ def check_families(self) -> None:
629629
for family in self.families.values():
630630
if len(family.members) < 2:
631631
self.error(f"Family {family.name!r} has insufficient members", family)
632-
members = [member for member in family.members if member in self.instrs or member in self.macro_instrs]
632+
members = [
633+
member
634+
for member in family.members
635+
if member in self.instrs or member in self.macro_instrs
636+
]
633637
if members != family.members:
634638
unknown = set(family.members) - set(members)
635639
self.error(
@@ -859,7 +863,9 @@ def write_stack_effect_functions(self) -> None:
859863
popped_data.append((instr, popped))
860864
pushed_data.append((instr, pushed))
861865

862-
def write_function(direction: str, data: list[tuple[AnyInstruction, str]]) -> None:
866+
def write_function(
867+
direction: str, data: list[tuple[AnyInstruction, str]]
868+
) -> None:
863869
self.out.emit("\n#ifndef NDEBUG")
864870
self.out.emit("static int")
865871
self.out.emit(f"_PyOpcode_num_{direction}(int opcode, int oparg) {{")
@@ -1031,19 +1037,32 @@ def write_super(self, sup: SuperInstruction) -> None:
10311037

10321038
def write_macro(self, mac: MacroInstruction) -> None:
10331039
"""Write code for a macro instruction."""
1040+
last_instr: Instruction | None = None
10341041
with self.wrap_super_or_macro(mac):
10351042
cache_adjust = 0
10361043
for part in mac.parts:
10371044
match part:
10381045
case parser.CacheEffect(size=size):
10391046
cache_adjust += size
10401047
case Component() as comp:
1048+
last_instr = comp.instr
10411049
comp.write_body(self.out, cache_adjust)
10421050
cache_adjust += comp.instr.cache_offset
10431051

10441052
if cache_adjust:
10451053
self.out.emit(f"JUMPBY({cache_adjust});")
10461054

1055+
if (
1056+
last_instr
1057+
and (family := last_instr.family)
1058+
and mac.name == family.members[0]
1059+
and (cache_size := family.size)
1060+
):
1061+
self.out.emit(
1062+
f"static_assert({cache_size} == "
1063+
f'{cache_adjust}, "incorrect cache size");'
1064+
)
1065+
10471066
@contextlib.contextmanager
10481067
def wrap_super_or_macro(self, up: SuperOrMacroInstruction):
10491068
"""Shared boilerplate for super- and macro instructions."""

Tools/cases_generator/test_generator.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ def test_macro_instruction():
383383
_tmp_3 = res;
384384
}
385385
JUMPBY(5);
386+
static_assert(INLINE_CACHE_ENTRIES_OP == 5, "incorrect cache size");
386387
STACK_SHRINK(2);
387388
POKE(1, _tmp_3);
388389
DISPATCH();

0 commit comments

Comments
 (0)