@@ -234,38 +234,30 @@ def pop(self, var: StackItem, out: CWriter) -> Local:
234
234
indirect = "&" if var .is_array () else ""
235
235
if self .variables :
236
236
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
261
243
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 )
269
261
self .base_offset = self .logical_sp
270
262
if var .name in UNUSED or not var .used :
271
263
return Local .unused (var , self .base_offset )
@@ -276,6 +268,12 @@ def pop(self, var: StackItem, out: CWriter) -> Local:
276
268
out .emit (assign )
277
269
return Local .from_memory (var , self .base_offset )
278
270
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
+
279
277
def push (self , var : Local ) -> None :
280
278
assert (var not in self .variables )
281
279
self .variables .append (var )
0 commit comments