@@ -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