summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-09-12 14:32:45 (GMT)
committerGitHub <noreply@github.com>2024-09-12 14:32:45 (GMT)
commit4ed7d1d6acc22807bfb5983c98fd59f7cb5061db (patch)
tree1a8fa46bf3f86fda923747b80a500d160009d637 /Tools/cases_generator
parent3ea51fa2e33797c772af6eaf6ede76d2dc6082ba (diff)
downloadcpython-4ed7d1d6acc22807bfb5983c98fd59f7cb5061db.zip
cpython-4ed7d1d6acc22807bfb5983c98fd59f7cb5061db.tar.gz
cpython-4ed7d1d6acc22807bfb5983c98fd59f7cb5061db.tar.bz2
GH-123996: Explicitly mark 'self_or_null' as an array of size 1 to ensure that it is kept in memory for calls (GH-124003)
Diffstat (limited to 'Tools/cases_generator')
-rw-r--r--Tools/cases_generator/generators_common.py9
-rw-r--r--Tools/cases_generator/stack.py11
2 files changed, 15 insertions, 5 deletions
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py
index dd4057c..2f8fcce 100644
--- a/Tools/cases_generator/generators_common.py
+++ b/Tools/cases_generator/generators_common.py
@@ -165,9 +165,12 @@ class Emitter:
if var.name == "unused" or var.name == "null" or var.peek:
continue
if var.size:
- self.out.emit(f"for (int _i = {var.size}; --_i >= 0;) {{\n")
- self.out.emit(f"PyStackRef_CLOSE({var.name}[_i]);\n")
- self.out.emit("}\n")
+ if var.size == "1":
+ self.out.emit(f"PyStackRef_CLOSE({var.name}[0]);\n")
+ else:
+ self.out.emit(f"for (int _i = {var.size}; --_i >= 0;) {{\n")
+ self.out.emit(f"PyStackRef_CLOSE({var.name}[_i]);\n")
+ self.out.emit("}\n")
elif var.condition:
if var.condition == "1":
self.out.emit(f"PyStackRef_CLOSE({var.name});\n")
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py
index 34bf597..de4d900 100644
--- a/Tools/cases_generator/stack.py
+++ b/Tools/cases_generator/stack.py
@@ -164,6 +164,8 @@ class StackOffset:
class StackError(Exception):
pass
+def array_or_scalar(var: StackItem | Local) -> str:
+ return "array" if var.is_array() else "scalar"
class Stack:
def __init__(self) -> None:
@@ -177,10 +179,15 @@ class Stack:
indirect = "&" if var.is_array() else ""
if self.variables:
popped = self.variables.pop()
+ if var.is_array() ^ popped.is_array():
+ raise StackError(
+ f"Array mismatch when popping '{popped.name}' from stack to assign to '{var.name}'. "
+ f"Expected {array_or_scalar(var)} got {array_or_scalar(popped)}"
+ )
if popped.size != var.size:
raise StackError(
- f"Size mismatch when popping '{popped.name}' from stack to assign to {var.name}. "
- f"Expected {var.size} got {popped.size}"
+ f"Size mismatch when popping '{popped.name}' from stack to assign to '{var.name}'. "
+ f"Expected {var_size(var)} got {var_size(popped.item)}"
)
if var.name in UNUSED:
if popped.name not in UNUSED and popped.name in self.defined: