Skip to content

Commit ff2cb21

Browse files
committed
Force stack to memory and clear logical stack if mismatch
1 parent 275056a commit ff2cb21

File tree

1 file changed

+29
-31
lines changed

1 file changed

+29
-31
lines changed

Tools/cases_generator/stack.py

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -234,38 +234,30 @@ def pop(self, var: StackItem, out: CWriter) -> Local:
234234
indirect = "&" if var.is_array() else ""
235235
if self.variables:
236236
popped = self.variables.pop()
237-
if var.is_array() ^ popped.is_array():
238-
raise StackError(
239-
f"Array mismatch when popping '{popped.name}' from stack to assign to '{var.name}'. "
240-
f"Expected {array_or_scalar(var)} got {array_or_scalar(popped)}"
241-
)
242-
if popped.size != var.size:
243-
raise StackError(
244-
f"Size mismatch when popping '{popped.name}' from stack to assign to '{var.name}'. "
245-
f"Expected {var_size(var)} got {var_size(popped.item)}"
246-
)
247-
if not var.used:
248-
return popped
249-
if popped.name != var.name:
250-
rename = f"{var.name} = {popped.name};\n"
251-
popped.item = var
252-
else:
253-
rename = ""
254-
if not popped.in_local:
255-
if popped.memory_offset is None:
256-
popped.memory_offset = self.logical_sp
257-
assert popped.memory_offset == self.logical_sp, (popped, self.as_comment())
258-
offset = popped.memory_offset.to_c()
259-
if var.is_array():
260-
defn = f"{var.name} = &stack_pointer[{offset}];\n"
237+
if var.is_array() == popped.is_array() and popped.size == var.size:
238+
if not var.used:
239+
return popped
240+
if popped.name != var.name:
241+
rename = f"{var.name} = {popped.name};\n"
242+
popped.item = var
261243
else:
262-
defn = f"{var.name} = stack_pointer[{offset}];\n"
263-
popped.in_local = True
264-
else:
265-
defn = rename
266-
out.emit(defn)
267-
return popped
268-
244+
rename = ""
245+
if not popped.in_local:
246+
if popped.memory_offset is None:
247+
popped.memory_offset = self.logical_sp
248+
assert popped.memory_offset == self.logical_sp, (popped, self.as_comment())
249+
offset = popped.memory_offset.to_c()
250+
if var.is_array():
251+
defn = f"{var.name} = &stack_pointer[{offset}];\n"
252+
else:
253+
defn = f"{var.name} = stack_pointer[{offset}];\n"
254+
popped.in_local = True
255+
else:
256+
defn = rename
257+
out.emit(defn)
258+
return popped
259+
#Mismatch
260+
self.clear(out)
269261
self.base_offset = self.logical_sp
270262
if var.name in UNUSED or not var.used:
271263
return Local.unused(var, self.base_offset)
@@ -276,6 +268,12 @@ def pop(self, var: StackItem, out: CWriter) -> Local:
276268
out.emit(assign)
277269
return Local.from_memory(var, self.base_offset)
278270

271+
def clear(self, out: CWriter):
272+
"Flush to memory and clear variables stack"
273+
self.flush(out)
274+
self.variables = []
275+
self.base_offset = self.logical_sp
276+
279277
def push(self, var: Local) -> None:
280278
assert(var not in self.variables)
281279
self.variables.append(var)

0 commit comments

Comments
 (0)