@@ -229,7 +229,7 @@ def drop(self, var: StackItem, check_liveness: bool) -> None:
229229 if check_liveness :
230230 raise StackError (f"Dropping live value '{ var .name } '" )
231231
232- def pop (self , var : StackItem ) -> tuple [ str , Local ] :
232+ def pop (self , var : StackItem , out : CWriter ) -> Local :
233233 self .logical_sp = self .logical_sp .pop (var )
234234 indirect = "&" if var .is_array () else ""
235235 if self .variables :
@@ -244,9 +244,9 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
244244 f"Size mismatch when popping '{ popped .name } ' from stack to assign to '{ var .name } '. "
245245 f"Expected { var_size (var )} got { var_size (popped .item )} "
246246 )
247- return "" , popped
247+ return popped
248248 if not var .used :
249- return "" , popped
249+ return popped
250250 if popped .name != var .name :
251251 rename = f"{ var .name } = { popped .name } ;\n "
252252 popped .item = var
@@ -264,17 +264,18 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
264264 popped .in_local = True
265265 else :
266266 defn = rename
267- return defn , popped
267+ out .emit (defn )
268+ return popped
268269
269270 self .base_offset = self .logical_sp
270271 if var .name in UNUSED or not var .used :
271- return "" , Local .unused (var , self .base_offset )
272+ return Local .unused (var , self .base_offset )
272273 cast = f"({ var .type } )" if (not indirect and var .type ) else ""
273274 bits = ".bits" if cast and self .extract_bits else ""
274275 offset = (self .base_offset - self .physical_sp ).to_c ()
275- assign = f"{ var .name } = { cast } { indirect } stack_pointer[{ offset } ]{ bits } ;"
276- assign = f" { assign } \n "
277- return assign , Local .from_memory (var , self .base_offset )
276+ assign = f"{ var .name } = { cast } { indirect } stack_pointer[{ offset } ]{ bits } ;\n "
277+ out . emit ( assign )
278+ return Local .from_memory (var , self .base_offset )
278279
279280 def push (self , var : Local ) -> None :
280281 assert (var not in self .variables )
@@ -391,8 +392,9 @@ def stacks(inst: Instruction | PseudoInstruction) -> Iterator[StackEffect]:
391392
392393def apply_stack_effect (stack : Stack , effect : StackEffect ) -> None :
393394 locals : dict [str , Local ] = {}
395+ null = CWriter .null ()
394396 for var in reversed (effect .inputs ):
395- _ , local = stack .pop (var )
397+ local = stack .pop (var , null )
396398 if var .name != "unused" :
397399 locals [local .name ] = local
398400 for var in effect .outputs :
@@ -518,13 +520,11 @@ def reload(self, out: CWriter) -> None:
518520 out .emit_reload ()
519521
520522 @staticmethod
521- def for_uop (stack : Stack , uop : Uop , check_liveness : bool = True ) -> tuple [list [str ], "Storage" ]:
522- code_list : list [str ] = []
523+ def for_uop (stack : Stack , uop : Uop , out : CWriter , check_liveness : bool = True ) -> "Storage" :
523524 inputs : list [Local ] = []
524525 peeks : list [Local ] = []
525526 for input in reversed (uop .stack .inputs ):
526- code , local = stack .pop (input )
527- code_list .append (code )
527+ local = stack .pop (input , out )
528528 if input .peek :
529529 peeks .append (local )
530530 else :
@@ -537,12 +537,12 @@ def for_uop(stack: Stack, uop: Uop, check_liveness: bool = True) -> tuple[list[s
537537 for ouput in uop .stack .outputs :
538538 if ouput .is_array () and ouput .used and not ouput .peek :
539539 c_offset = offset .to_c ()
540- code_list . append (f"{ ouput .name } = &stack_pointer[{ c_offset } ];\n " )
540+ out . emit (f"{ ouput .name } = &stack_pointer[{ c_offset } ];\n " )
541541 offset = offset .push (ouput )
542542 for var in inputs :
543543 stack .push (var )
544544 outputs = [ Local .undefined (var ) for var in uop .stack .outputs if not var .peek ]
545- return code_list , Storage (stack , inputs , outputs , check_liveness )
545+ return Storage (stack , inputs , outputs , check_liveness )
546546
547547 @staticmethod
548548 def copy_list (arg : list [Local ]) -> list [Local ]:
@@ -716,5 +716,4 @@ def close_variable(var: Local, overwrite: str) -> None:
716716 if output_in_place :
717717 self .stack .flush (out )
718718 if output is not None :
719- code , output = self .stack .pop (output .item )
720- out .emit (code )
719+ output = self .stack .pop (output .item , out )
0 commit comments