Skip to content

Commit

Permalink
gh-104504: Cases generator: enable mypy's possibly-undefined error …
Browse files Browse the repository at this point in the history
…code (#108454)
  • Loading branch information
AlexWaygood authored Aug 25, 2023
1 parent 6895ddf commit 5a25daa
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
13 changes: 9 additions & 4 deletions Tools/cases_generator/generate_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ def effect_str(effects: list[StackEffect]) -> str:
return str(n_effect)

instr: AnyInstruction | None
popped: str | None = None
pushed: str | None = None
match thing:
case parsing.InstDef():
if thing.kind != "op" or self.instrs[thing.name].is_viable_uop():
Expand All @@ -173,21 +175,22 @@ def effect_str(effects: list[StackEffect]) -> str:
instr = self.pseudo_instrs[thing.name]
# Calculate stack effect, and check that it's the the same
# for all targets.
for idx, target in enumerate(self.pseudos[thing.name].targets):
for target in self.pseudos[thing.name].targets:
target_instr = self.instrs.get(target)
# Currently target is always an instr. This could change
# in the future, e.g., if we have a pseudo targetting a
# macro instruction.
assert target_instr
target_popped = effect_str(target_instr.input_effects)
target_pushed = effect_str(target_instr.output_effects)
if idx == 0:
if popped is None:
popped, pushed = target_popped, target_pushed
else:
assert popped == target_popped
assert pushed == target_pushed
case _:
assert_never(thing)
assert popped is not None and pushed is not None
return instr, popped, pushed

@contextlib.contextmanager
Expand Down Expand Up @@ -376,6 +379,7 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No
# Compute the set of all instruction formats.
all_formats: set[str] = set()
for thing in self.everything:
format: str | None = None
match thing:
case OverriddenInstructionPlaceHolder():
continue
Expand All @@ -384,15 +388,16 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No
case parsing.Macro():
format = self.macro_instrs[thing.name].instr_fmt
case parsing.Pseudo():
for idx, target in enumerate(self.pseudos[thing.name].targets):
for target in self.pseudos[thing.name].targets:
target_instr = self.instrs.get(target)
assert target_instr
if idx == 0:
if format is None:
format = target_instr.instr_fmt
else:
assert format == target_instr.instr_fmt
case _:
assert_never(thing)
assert format is not None
all_formats.add(format)

# Turn it into a sorted list of enum values.
Expand Down
2 changes: 1 addition & 1 deletion Tools/cases_generator/mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ python_version = 3.10
# ...And be strict:
strict = True
strict_concatenate = True
enable_error_code = ignore-without-code,redundant-expr,truthy-bool
enable_error_code = ignore-without-code,redundant-expr,truthy-bool,possibly-undefined
warn_unreachable = True

0 comments on commit 5a25daa

Please sign in to comment.