@@ -229,7 +229,7 @@ def drop(self, var: StackItem, check_liveness: bool) -> None:
229
229
if check_liveness :
230
230
raise StackError (f"Dropping live value '{ var .name } '" )
231
231
232
- def pop (self , var : StackItem ) -> tuple [ str , Local ] :
232
+ def pop (self , var : StackItem , out : CWriter ) -> Local :
233
233
self .logical_sp = self .logical_sp .pop (var )
234
234
indirect = "&" if var .is_array () else ""
235
235
if self .variables :
@@ -244,9 +244,9 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
244
244
f"Size mismatch when popping '{ popped .name } ' from stack to assign to '{ var .name } '. "
245
245
f"Expected { var_size (var )} got { var_size (popped .item )} "
246
246
)
247
- return "" , popped
247
+ return popped
248
248
if not var .used :
249
- return "" , popped
249
+ return popped
250
250
if popped .name != var .name :
251
251
rename = f"{ var .name } = { popped .name } ;\n "
252
252
popped .item = var
@@ -264,17 +264,18 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
264
264
popped .in_local = True
265
265
else :
266
266
defn = rename
267
- return defn , popped
267
+ out .emit (defn )
268
+ return popped
268
269
269
270
self .base_offset = self .logical_sp
270
271
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 )
272
273
cast = f"({ var .type } )" if (not indirect and var .type ) else ""
273
274
bits = ".bits" if cast and self .extract_bits else ""
274
275
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 )
278
279
279
280
def push (self , var : Local ) -> None :
280
281
assert (var not in self .variables )
@@ -391,8 +392,9 @@ def stacks(inst: Instruction | PseudoInstruction) -> Iterator[StackEffect]:
391
392
392
393
def apply_stack_effect (stack : Stack , effect : StackEffect ) -> None :
393
394
locals : dict [str , Local ] = {}
395
+ null = CWriter .null ()
394
396
for var in reversed (effect .inputs ):
395
- _ , local = stack .pop (var )
397
+ local = stack .pop (var , null )
396
398
if var .name != "unused" :
397
399
locals [local .name ] = local
398
400
for var in effect .outputs :
@@ -518,13 +520,11 @@ def reload(self, out: CWriter) -> None:
518
520
out .emit_reload ()
519
521
520
522
@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" :
523
524
inputs : list [Local ] = []
524
525
peeks : list [Local ] = []
525
526
for input in reversed (uop .stack .inputs ):
526
- code , local = stack .pop (input )
527
- code_list .append (code )
527
+ local = stack .pop (input , out )
528
528
if input .peek :
529
529
peeks .append (local )
530
530
else :
@@ -537,12 +537,12 @@ def for_uop(stack: Stack, uop: Uop, check_liveness: bool = True) -> tuple[list[s
537
537
for ouput in uop .stack .outputs :
538
538
if ouput .is_array () and ouput .used and not ouput .peek :
539
539
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 " )
541
541
offset = offset .push (ouput )
542
542
for var in inputs :
543
543
stack .push (var )
544
544
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 )
546
546
547
547
@staticmethod
548
548
def copy_list (arg : list [Local ]) -> list [Local ]:
@@ -716,5 +716,4 @@ def close_variable(var: Local, overwrite: str) -> None:
716
716
if output_in_place :
717
717
self .stack .flush (out )
718
718
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