◐ Shell
clean mode source ↗

GH-122155: Fix cases generator to correctly compute 'peek' offset for error handling by markshannon · Pull Request #122158 · python/cpython

Expand Up @@ -49,6 +49,9 @@ class StackOffset: def empty() -> "StackOffset": return StackOffset([], [])
def copy(self) -> "StackOffset": return StackOffset(self.popped[:], self.pushed[:])
def pop(self, item: StackItem) -> None: self.popped.append(var_size(item))
Expand Down Expand Up @@ -122,14 +125,11 @@ class Stack: def __init__(self) -> None: self.top_offset = StackOffset.empty() self.base_offset = StackOffset.empty() self.peek_offset = StackOffset.empty() self.variables: list[StackItem] = [] self.defined: set[str] = set()
def pop(self, var: StackItem, extract_bits: bool = False) -> str: self.top_offset.pop(var) if not var.peek: self.peek_offset.pop(var) indirect = "&" if var.is_array() else "" if self.variables: popped = self.variables.pop() Expand Down Expand Up @@ -210,9 +210,16 @@ def flush(self, out: CWriter, cast_type: str = "uintptr_t", extract_bits: bool = self.variables = [] self.base_offset.clear() self.top_offset.clear() self.peek_offset.clear() out.start_line()
def peek_offset(self) -> str: peek = self.base_offset.copy() for var in self.variables: if not var.peek: break peek.push(var) return peek.to_c()
def as_comment(self) -> str: return f"/* Variables: {[v.name for v in self.variables]}. Base offset: {self.base_offset.to_c()}. Top offset: {self.top_offset.to_c()} */"
Expand Down