From 3c0f65ebce10d5327e07245f7cf2beb96b18c970 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Thu, 5 Oct 2023 15:05:29 -0700 Subject: gh-109287: fix overrides in cases generator (#110419) --- Lib/test/test_generated_cases.py | 35 +++++++++++++++++++++++++++++++++ Tools/cases_generator/analysis.py | 11 ++--------- Tools/cases_generator/generate_cases.py | 17 ---------------- Tools/cases_generator/instructions.py | 5 ----- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index 5971d2e..790e6b1 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -598,6 +598,41 @@ class TestGeneratedCases(unittest.TestCase): """ self.run_cases_test(input, output) + def test_override_inst(self): + input = """ + inst(OP, (--)) { + spam(); + } + override inst(OP, (--)) { + ham(); + } + """ + output = """ + TARGET(OP) { + ham(); + DISPATCH(); + } + """ + self.run_cases_test(input, output) + + def test_override_op(self): + input = """ + op(OP, (--)) { + spam(); + } + macro(M) = OP; + override op(OP, (--)) { + ham(); + } + """ + output = """ + TARGET(M) { + ham(); + DISPATCH(); + } + """ + self.run_cases_test(input, output) + if __name__ == "__main__": unittest.main() diff --git a/Tools/cases_generator/analysis.py b/Tools/cases_generator/analysis.py index 7bbc924..b2fa020 100644 --- a/Tools/cases_generator/analysis.py +++ b/Tools/cases_generator/analysis.py @@ -12,7 +12,6 @@ from instructions import ( InstructionOrCacheEffect, MacroInstruction, MacroParts, - OverriddenInstructionPlaceHolder, PseudoInstruction, ) import parsing @@ -66,7 +65,6 @@ class Analyzer: parsing.InstDef | parsing.Macro | parsing.Pseudo - | OverriddenInstructionPlaceHolder ] instrs: dict[str, Instruction] # Includes ops macros: dict[str, parsing.Macro] @@ -141,7 +139,7 @@ class Analyzer: match thing: case parsing.InstDef(name=name): macro: parsing.Macro | None = None - if thing.kind == "inst": + if thing.kind == "inst" and not thing.override: macro = parsing.Macro(name, [parsing.OpName(name)]) if name in self.instrs: if not thing.override: @@ -150,12 +148,7 @@ class Analyzer: f"previous definition @ {self.instrs[name].inst.context}", thing_first_token, ) - placeholder = OverriddenInstructionPlaceHolder(name=name) - self.everything[instrs_idx[name]] = placeholder - if macro is not None: - self.warning( - f"Overriding desugared {macro.name} may not work", thing - ) + self.everything[instrs_idx[name]] = thing if name not in self.instrs and thing.override: raise psr.make_syntax_error( f"Definition of '{name}' @ {thing.context} is supposed to be " diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 01ab83b..dbb1641 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -26,7 +26,6 @@ from instructions import ( MacroInstruction, MacroParts, PseudoInstruction, - OverriddenInstructionPlaceHolder, TIER_ONE, TIER_TWO, ) @@ -208,8 +207,6 @@ class Generator(Analyzer): popped_data: list[tuple[AnyInstruction, str]] = [] pushed_data: list[tuple[AnyInstruction, str]] = [] for thing in self.everything: - if isinstance(thing, OverriddenInstructionPlaceHolder): - continue if isinstance(thing, parsing.Macro) and thing.name in self.instrs: continue instr, popped, pushed = self.get_stack_effect_info(thing) @@ -393,8 +390,6 @@ class Generator(Analyzer): for thing in self.everything: format: str | None = None match thing: - case OverriddenInstructionPlaceHolder(): - continue case parsing.InstDef(): format = self.instrs[thing.name].instr_fmt case parsing.Macro(): @@ -492,8 +487,6 @@ class Generator(Analyzer): # Write metadata for each instruction for thing in self.everything: match thing: - case OverriddenInstructionPlaceHolder(): - continue case parsing.InstDef(): self.write_metadata_for_inst(self.instrs[thing.name]) case parsing.Macro(): @@ -774,8 +767,6 @@ class Generator(Analyzer): n_macros = 0 for thing in self.everything: match thing: - case OverriddenInstructionPlaceHolder(): - self.write_overridden_instr_place_holder(thing) case parsing.InstDef(): pass case parsing.Macro(): @@ -836,14 +827,6 @@ class Generator(Analyzer): file=sys.stderr, ) - def write_overridden_instr_place_holder( - self, place_holder: OverriddenInstructionPlaceHolder - ) -> None: - self.out.emit("") - self.out.emit( - f"{self.out.comment} TARGET({place_holder.name}) overridden by later definition" - ) - def is_super_instruction(mac: MacroInstruction) -> bool: if ( diff --git a/Tools/cases_generator/instructions.py b/Tools/cases_generator/instructions.py index bd7b7df..c6b5516 100644 --- a/Tools/cases_generator/instructions.py +++ b/Tools/cases_generator/instructions.py @@ -295,11 +295,6 @@ class PseudoInstruction: instr_flags: InstructionFlags -@dataclasses.dataclass -class OverriddenInstructionPlaceHolder: - name: str - - AnyInstruction = Instruction | MacroInstruction | PseudoInstruction -- cgit v0.12