diff options
author | Mark Shannon <mark@hotpy.org> | 2024-09-12 14:32:45 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-12 14:32:45 (GMT) |
commit | 4ed7d1d6acc22807bfb5983c98fd59f7cb5061db (patch) | |
tree | 1a8fa46bf3f86fda923747b80a500d160009d637 /Tools/cases_generator | |
parent | 3ea51fa2e33797c772af6eaf6ede76d2dc6082ba (diff) | |
download | cpython-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.py | 9 | ||||
-rw-r--r-- | Tools/cases_generator/stack.py | 11 |
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: |