Skip to content

Commit 387fbe1

Browse files
committed
Move check_overlaps to generate_cases.py
1 parent b5c8a9f commit 387fbe1

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

Tools/cases_generator/generate_cases.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class Instruction(parser.InstDef):
4040

4141
def __init__(self, inst: parser.InstDef):
4242
super().__init__(inst.header, inst.block)
43+
self.context = inst.context
4344
self.always_exits = always_exits(self.block)
4445
self.cache_effects = [
4546
effect for effect in self.inputs if isinstance(effect, parser.CacheEffect)
@@ -50,6 +51,18 @@ def __init__(self, inst: parser.InstDef):
5051
]
5152
self.output_effects = self.outputs # For consistency/completeness
5253

54+
def check_overlaps(self, psr: parser.Parser) -> None:
55+
for i, inp in enumerate(self.input_effects):
56+
for j, outp in enumerate(self.output_effects):
57+
if inp.name == outp.name and inp.name != "unused":
58+
if i != j:
59+
tkn = psr.tokens[ctx.begin] if (ctx := self.context) else None
60+
raise psr.make_syntax_error(
61+
f"Input {inp.name!r} at pos {i} repeated in output at different pos {j}",
62+
tkn,
63+
)
64+
break
65+
5366
def write(
5467
self, f: typing.TextIO, indent: str, dedent: int = 0
5568
) -> None:
@@ -182,7 +195,8 @@ def parse(self) -> None:
182195
self.families = {}
183196
while (tkn := psr.peek(raw=True)) and tkn.text != END_MARKER:
184197
if inst := psr.inst_def():
185-
self.instrs[inst.name] = Instruction(inst)
198+
self.instrs[inst.name] = instr = Instruction(inst)
199+
instr.check_overlaps(psr)
186200
elif super := psr.super_def():
187201
self.supers[super.name] = super
188202
elif family := psr.family_def():

Tools/cases_generator/parser.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,23 +134,11 @@ def inst_header(self) -> InstHeader | None:
134134
if self.expect(lx.RPAREN):
135135
if ((tkn := self.peek())
136136
and tkn.kind == lx.LBRACE):
137-
self.check_overlaps(inp, outp)
138137
return InstHeader(name, inp, outp)
139138
elif self.expect(lx.RPAREN):
140139
return InstHeader(name, [], [])
141140
return None
142141

143-
def check_overlaps(self, inputs: list[InputEffect], outputs: list[OutputEffect]):
144-
# TODO: This belongs in generate_cases.py::Analyzer::analyze()
145-
inputs = [inp for inp in inputs if isinstance(inp, StackEffect)] # Select only stack effects
146-
for i, inp in enumerate(inputs):
147-
for j, outp in enumerate(outputs):
148-
if inp.name == outp.name and inp.name != "unused":
149-
if i != j:
150-
raise self.make_syntax_error(
151-
f"Input {inp.name!r} at pos {i} repeated in output at different pos {j}")
152-
break
153-
154142
def stack_effect(self) -> tuple[list[InputEffect], list[OutputEffect]]:
155143
# '(' [inputs] '--' [outputs] ')'
156144
if self.expect(lx.LPAREN):

0 commit comments

Comments
 (0)