Skip to content

Commit 1aafac8

Browse files
committed
Introduce error() method to print errors
1 parent a034675 commit 1aafac8

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

Tools/cases_generator/generate_cases.py

+23-22
Original file line numberDiff line numberDiff line change
@@ -218,11 +218,10 @@ def super_macro_analysis(
218218
lowest = current = highest = 0
219219
for instr in components:
220220
if instr.cache_effects:
221-
print(
221+
a.error(
222222
f"Super-instruction {self.name!r} has cache effects in {instr.name!r}",
223-
file=sys.stderr,
223+
instr,
224224
)
225-
a.errors += 1
226225
current -= len(instr.input_effects)
227226
lowest = min(lowest, current)
228227
current += len(instr.output_effects)
@@ -239,7 +238,18 @@ class Analyzer:
239238

240239
filename: str
241240
src: str
242-
errors: int = 0 # TODO: add a method to print an error message
241+
errors: int = 0
242+
243+
def error(self, msg: str, node: parser.Node) -> None:
244+
lineno = 0
245+
if context := node.context:
246+
# Use line number of first non-comment in the node
247+
for token in context.owner.tokens[context.begin : context.end]:
248+
lineno = token.line
249+
if token.kind != "COMMENT":
250+
break
251+
print(f"{self.filename}:{lineno}: {msg}", file=sys.stderr)
252+
self.errors += 1
243253

244254
def __init__(self, filename: str):
245255
"""Read the input file."""
@@ -303,11 +313,10 @@ def find_predictions(self) -> None:
303313
if target_instr := self.instrs.get(target):
304314
target_instr.predicted = True
305315
else:
306-
print(
316+
self.error(
307317
f"Unknown instruction {target!r} predicted in {instr.name!r}",
308-
file=sys.stderr,
318+
instr, # TODO: Use better location
309319
)
310-
self.errors += 1
311320

312321
def map_families(self) -> None:
313322
"""Make instruction names back to their family, if they have one."""
@@ -316,11 +325,10 @@ def map_families(self) -> None:
316325
if member_instr := self.instrs.get(member):
317326
member_instr.family = family
318327
else:
319-
print(
328+
self.error(
320329
f"Unknown instruction {member!r} referenced in family {family.name!r}",
321-
file=sys.stderr,
330+
family,
322331
)
323-
self.errors += 1
324332

325333
def check_families(self) -> None:
326334
"""Check each family:
@@ -331,13 +339,11 @@ def check_families(self) -> None:
331339
"""
332340
for family in self.families.values():
333341
if len(family.members) < 2:
334-
print(f"Family {family.name!r} has insufficient members")
335-
self.errors += 1
342+
self.error(f"Family {family.name!r} has insufficient members", family)
336343
members = [member for member in family.members if member in self.instrs]
337344
if members != family.members:
338345
unknown = set(family.members) - set(members)
339-
print(f"Family {family.name!r} has unknown members: {unknown}")
340-
self.errors += 1
346+
self.error(f"Family {family.name!r} has unknown members: {unknown}", family)
341347
if len(members) < 2:
342348
continue
343349
head = self.instrs[members[0]]
@@ -350,18 +356,13 @@ def check_families(self) -> None:
350356
i = len(instr.input_effects)
351357
o = len(instr.output_effects)
352358
if (c, i, o) != (cache, input, output):
353-
self.errors += 1
354-
print(
359+
self.error(
355360
f"Family {family.name!r} has inconsistent "
356-
f"(cache, inputs, outputs) effects:",
357-
file=sys.stderr,
358-
)
359-
print(
361+
f"(cache, inputs, outputs) effects:\n"
360362
f" {family.members[0]} = {(cache, input, output)}; "
361363
f"{member} = {(c, i, o)}",
362-
file=sys.stderr,
364+
family,
363365
)
364-
self.errors += 1
365366

366367
def analyze_supers(self) -> None:
367368
"""Analyze each super instruction."""

0 commit comments

Comments
 (0)