summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-07-09 10:33:56 (GMT)
committerGitHub <noreply@github.com>2024-07-09 10:33:56 (GMT)
commitbf8686e1ea389427157c754c5e522ee040f166ad (patch)
treeafd2235abf923faf6df46676640bb74ad220ca93 /Tools
parentfacf9862da0cf9331550747197800d682cd371fb (diff)
downloadcpython-bf8686e1ea389427157c754c5e522ee040f166ad.zip
cpython-bf8686e1ea389427157c754c5e522ee040f166ad.tar.gz
cpython-bf8686e1ea389427157c754c5e522ee040f166ad.tar.bz2
GH-118926: Better distinguish between pointer and arrays in interpreter generator (GH-121496)
Diffstat (limited to 'Tools')
-rw-r--r--Tools/cases_generator/analyzer.py8
-rw-r--r--Tools/cases_generator/generators_common.py14
-rw-r--r--Tools/cases_generator/parsing.py1
-rw-r--r--Tools/cases_generator/stack.py11
-rw-r--r--Tools/cases_generator/tier1_generator.py11
-rw-r--r--Tools/cases_generator/tier2_generator.py3
6 files changed, 30 insertions, 18 deletions
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index f92560b..ec365ba 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -106,13 +106,15 @@ class StackItem:
def __str__(self) -> str:
cond = f" if ({self.condition})" if self.condition else ""
- size = f"[{self.size}]" if self.size != "1" else ""
+ size = f"[{self.size}]" if self.size else ""
type = "" if self.type is None else f"{self.type} "
return f"{type}{self.name}{size}{cond} {self.peek}"
def is_array(self) -> bool:
- return self.type == "_PyStackRef *"
+ return self.size != ""
+ def get_size(self) -> str:
+ return self.size if self.size else "1"
@dataclass
class StackEffect:
@@ -293,7 +295,7 @@ def convert_stack_item(item: parser.StackEffect, replace_op_arg_1: str | None) -
if replace_op_arg_1 and OPARG_AND_1.match(item.cond):
cond = replace_op_arg_1
return StackItem(
- item.name, item.type, cond, (item.size or "1")
+ item.name, item.type, cond, item.size
)
def analyze_stack(op: parser.InstDef | parser.Pseudo, replace_op_arg_1: str | None = None) -> StackEffect:
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py
index e4e0c9b..9314bb9 100644
--- a/Tools/cases_generator/generators_common.py
+++ b/Tools/cases_generator/generators_common.py
@@ -5,9 +5,10 @@ from analyzer import (
Instruction,
Uop,
Properties,
+ StackItem,
)
from cwriter import CWriter
-from typing import Callable, Mapping, TextIO, Iterator
+from typing import Callable, Mapping, TextIO, Iterator, Tuple
from lexer import Token
from stack import Stack
@@ -24,6 +25,15 @@ def root_relative_path(filename: str) -> str:
return filename
+def type_and_null(var: StackItem) -> Tuple[str, str]:
+ if var.type:
+ return var.type, "NULL"
+ elif var.is_array():
+ return "_PyStackRef *", "NULL"
+ else:
+ return "_PyStackRef", "PyStackRef_NULL"
+
+
def write_header(
generator: str, sources: list[str], outfile: TextIO, comment: str = "//"
) -> None:
@@ -126,7 +136,7 @@ def replace_decrefs(
for var in uop.stack.inputs:
if var.name == "unused" or var.name == "null" or var.peek:
continue
- if var.size != "1":
+ if var.size:
out.emit(f"for (int _i = {var.size}; --_i >= 0;) {{\n")
out.emit(f"PyStackRef_CLOSE({var.name}[_i]);\n")
out.emit("}\n")
diff --git a/Tools/cases_generator/parsing.py b/Tools/cases_generator/parsing.py
index 0bd4229..8957838 100644
--- a/Tools/cases_generator/parsing.py
+++ b/Tools/cases_generator/parsing.py
@@ -285,7 +285,6 @@ class Parser(PLexer):
if not (size := self.expression()):
raise self.make_syntax_error("Expected expression")
self.require(lx.RBRACKET)
- type_text = "_PyStackRef *"
size_text = size.text.strip()
return StackEffect(tkn.text, type_text, cond_text, size_text)
return None
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py
index c0e1278..ebe62df 100644
--- a/Tools/cases_generator/stack.py
+++ b/Tools/cases_generator/stack.py
@@ -28,14 +28,15 @@ def var_size(var: StackItem) -> str:
if var.condition == "0":
return "0"
elif var.condition == "1":
- return var.size
- elif var.condition == "oparg & 1" and var.size == "1":
+ return var.get_size()
+ elif var.condition == "oparg & 1" and not var.size:
return f"({var.condition})"
else:
- return f"(({var.condition}) ? {var.size} : 0)"
- else:
+ return f"(({var.condition}) ? {var.get_size()} : 0)"
+ elif var.size:
return var.size
-
+ else:
+ return "1"
@dataclass
class StackOffset:
diff --git a/Tools/cases_generator/tier1_generator.py b/Tools/cases_generator/tier1_generator.py
index c9dce1d..85be673 100644
--- a/Tools/cases_generator/tier1_generator.py
+++ b/Tools/cases_generator/tier1_generator.py
@@ -13,12 +13,14 @@ from analyzer import (
analyze_files,
Skip,
analysis_error,
+ StackItem,
)
from generators_common import (
DEFAULT_INPUT,
ROOT,
write_header,
emit_tokens,
+ type_and_null,
)
from cwriter import CWriter
from typing import TextIO
@@ -38,19 +40,16 @@ def declare_variables(inst: Instruction, out: CWriter) -> None:
for var in reversed(uop.stack.inputs):
if var.name not in variables:
variables.add(var.name)
- type, null = (var.type, "NULL") if var.type else ("_PyStackRef", "PyStackRef_NULL")
+ type, null = type_and_null(var)
space = " " if type[-1].isalnum() else ""
if var.condition:
out.emit(f"{type}{space}{var.name} = {null};\n")
else:
- if var.is_array():
- out.emit(f"{var.type}{space}{var.name};\n")
- else:
- out.emit(f"{type}{space}{var.name};\n")
+ out.emit(f"{type}{space}{var.name};\n")
for var in uop.stack.outputs:
if var.name not in variables:
variables.add(var.name)
- type, null = (var.type, "NULL") if var.type else ("_PyStackRef", "PyStackRef_NULL")
+ type, null = type_and_null(var)
space = " " if type[-1].isalnum() else ""
if var.condition:
out.emit(f"{type}{space}{var.name} = {null};\n")
diff --git a/Tools/cases_generator/tier2_generator.py b/Tools/cases_generator/tier2_generator.py
index f3769bd..7a69aa6 100644
--- a/Tools/cases_generator/tier2_generator.py
+++ b/Tools/cases_generator/tier2_generator.py
@@ -20,6 +20,7 @@ from generators_common import (
emit_tokens,
emit_to,
REPLACEMENT_FUNCTIONS,
+ type_and_null,
)
from cwriter import CWriter
from typing import TextIO, Iterator
@@ -35,7 +36,7 @@ def declare_variable(
if var.name in variables:
return
variables.add(var.name)
- type, null = (var.type, "NULL") if var.type else ("_PyStackRef", "PyStackRef_NULL")
+ type, null = type_and_null(var)
space = " " if type[-1].isalnum() else ""
if var.condition:
out.emit(f"{type}{space}{var.name} = {null};\n")