summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-12-18 11:14:40 (GMT)
committerGitHub <noreply@github.com>2023-12-18 11:14:40 (GMT)
commit771903596b07af50cab2aaa3c7dfc9cc06e51a06 (patch)
tree827ad8a44a775ae59acbe14071ecca32c5a06646 /Tools/cases_generator
parent4a24bf9a13a7cf055113c04bde0874186722c62c (diff)
downloadcpython-771903596b07af50cab2aaa3c7dfc9cc06e51a06.zip
cpython-771903596b07af50cab2aaa3c7dfc9cc06e51a06.tar.gz
cpython-771903596b07af50cab2aaa3c7dfc9cc06e51a06.tar.bz2
GH-111485: Test the new cases generator (GH-113252)
Diffstat (limited to 'Tools/cases_generator')
-rw-r--r--Tools/cases_generator/analyzer.py3
-rw-r--r--Tools/cases_generator/cwriter.py15
-rw-r--r--Tools/cases_generator/generators_common.py6
-rw-r--r--Tools/cases_generator/stack.py2
-rw-r--r--Tools/cases_generator/tier1_generator.py8
5 files changed, 24 insertions, 10 deletions
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index bcc1353..2147f6f 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -444,7 +444,8 @@ def analyze_forest(forest: list[parser.AstNode]) -> Analysis:
if target.text in instructions:
instructions[target.text].is_target = True
# Hack
- instructions["BINARY_OP_INPLACE_ADD_UNICODE"].family = families["BINARY_OP"]
+ if "BINARY_OP_INPLACE_ADD_UNICODE" in instructions:
+ instructions["BINARY_OP_INPLACE_ADD_UNICODE"].family = families["BINARY_OP"]
return Analysis(instructions, uops, families, pseudos)
diff --git a/Tools/cases_generator/cwriter.py b/Tools/cases_generator/cwriter.py
index 34e3985..67b1c9a 100644
--- a/Tools/cases_generator/cwriter.py
+++ b/Tools/cases_generator/cwriter.py
@@ -38,7 +38,8 @@ class CWriter:
parens = txt.count("(") - txt.count(")")
if parens < 0:
self.indents.pop()
- elif "}" in txt or is_label(txt):
+ braces = txt.count("{") - txt.count("}")
+ if braces < 0 or is_label(txt):
self.indents.pop()
def maybe_indent(self, txt: str) -> None:
@@ -50,11 +51,13 @@ class CWriter:
self.indents.append(offset)
if is_label(txt):
self.indents.append(self.indents[-1] + 4)
- elif "{" in txt:
- if 'extern "C"' in txt:
- self.indents.append(self.indents[-1])
- else:
- self.indents.append(self.indents[-1] + 4)
+ else:
+ braces = txt.count("{") - txt.count("}")
+ if braces > 0:
+ if 'extern "C"' in txt:
+ self.indents.append(self.indents[-1])
+ else:
+ self.indents.append(self.indents[-1] + 4)
def emit_text(self, txt: str) -> None:
self.out.write(txt)
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py
index e0674a7..1b565bf 100644
--- a/Tools/cases_generator/generators_common.py
+++ b/Tools/cases_generator/generators_common.py
@@ -22,8 +22,10 @@ DEFAULT_INPUT = (ROOT / "Python/bytecodes.c").absolute().as_posix()
def root_relative_path(filename: str) -> str:
- return Path(filename).absolute().relative_to(ROOT).as_posix()
-
+ try:
+ return Path(filename).absolute().relative_to(ROOT).as_posix()
+ except ValueError:
+ return filename
def write_header(generator: str, sources: list[str], outfile: TextIO) -> None:
outfile.write(
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py
index c36a56e..0b31ce4 100644
--- a/Tools/cases_generator/stack.py
+++ b/Tools/cases_generator/stack.py
@@ -148,7 +148,7 @@ class Stack:
cast = "(PyObject *)" if var.type else ""
if var.name != "unused" and not var.is_array():
if var.condition:
- out.emit(f" if ({var.condition}) ")
+ out.emit(f"if ({var.condition}) ")
out.emit(
f"stack_pointer[{self.base_offset.to_c()}] = {cast}{var.name};\n"
)
diff --git a/Tools/cases_generator/tier1_generator.py b/Tools/cases_generator/tier1_generator.py
index 11885dc..bcfd2d8 100644
--- a/Tools/cases_generator/tier1_generator.py
+++ b/Tools/cases_generator/tier1_generator.py
@@ -181,6 +181,14 @@ arg_parser.add_argument(
"input", nargs=argparse.REMAINDER, help="Instruction definition file(s)"
)
+
+def generate_tier1_from_files(
+ filenames: list[str], outfilename: str, lines: bool
+) -> None:
+ data = analyze_files(filenames)
+ with open(outfilename, "w") as outfile:
+ generate_tier1(filenames, data, outfile, lines)
+
if __name__ == "__main__":
args = arg_parser.parse_args()
if len(args.input) == 0: