GH-122155: Fix cases generator to correctly compute 'peek' offset for error handling (GH-122158)

This commit is contained in:
Mark Shannon 2024-07-23 14:12:06 +01:00 committed by GitHub
parent 498cb6dff1
commit 624bda7638
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 68 additions and 6 deletions

View file

@ -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))
@ -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()
@ -210,9 +210,16 @@ class Stack:
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()} */"