@@ -169,7 +169,6 @@ def __init__(self) -> None:
169
169
self .top_offset = StackOffset .empty ()
170
170
self .base_offset = StackOffset .empty ()
171
171
self .variables : list [Local ] = []
172
- self .outputs : list [Local ] = []
173
172
self .defined : set [str ] = set ()
174
173
175
174
def pop (self , var : StackItem , extract_bits : bool = False ) -> tuple [str , Local ]:
@@ -245,28 +244,22 @@ def push(self, var: Local) -> str:
245
244
self .defined .add (var .name )
246
245
return ""
247
246
248
- def define_outputs (self , outputs : list [Local ]) -> str :
247
+ def define_output_arrays (self , outputs : list [StackItem ]) -> str :
249
248
res = []
250
249
top_offset = self .top_offset .copy ()
251
250
for var in outputs :
252
- if var .is_array () and var .item . used and not var . item .peek :
251
+ if var .is_array () and var .used and not var .peek :
253
252
c_offset = top_offset .to_c ()
253
+ top_offset .push (var )
254
254
res .append (f"{ var .name } = &stack_pointer[{ c_offset } ];\n " )
255
- self . outputs . append ( var )
256
- top_offset .push (var . item )
255
+ else :
256
+ top_offset .push (var )
257
257
return "\n " .join (res )
258
258
259
- def push_outputs (self ) -> str :
260
- res = []
261
- for var in self .outputs :
262
- res .append (self .push (var ))
263
- self .outputs = []
264
- return "" .join (res )
265
-
266
259
@staticmethod
267
- def _do_emit (out : CWriter , var : Local , base_offset : StackOffset ,
260
+ def _do_emit (out : CWriter , var : StackItem , base_offset : StackOffset ,
268
261
cast_type : str = "uintptr_t" , extract_bits : bool = False ) -> None :
269
- cast = f"({ cast_type } )" if var .item . type else ""
262
+ cast = f"({ cast_type } )" if var .type else ""
270
263
bits = ".bits" if cast and not extract_bits else ""
271
264
if var .condition == "0" :
272
265
return
@@ -282,7 +275,7 @@ def _do_flush(out: CWriter, variables: list[Local], base_offset: StackOffset, to
282
275
out .start_line ()
283
276
for var in variables :
284
277
if var .cached and not var .in_memory and not var .item .peek and not var .name in UNUSED :
285
- Stack ._do_emit (out , var , base_offset , cast_type , extract_bits )
278
+ Stack ._do_emit (out , var . item , base_offset , cast_type , extract_bits )
286
279
base_offset .push (var .item )
287
280
if base_offset .to_c () != top_offset .to_c ():
288
281
print ("base" , base_offset , "top" , top_offset )
@@ -302,18 +295,22 @@ def flush(self, out: CWriter, cast_type: str = "uintptr_t", extract_bits: bool =
302
295
self .base_offset .clear ()
303
296
self .top_offset .clear ()
304
297
305
- def flush_single_var (self , out : CWriter , var_name : str , cast_type : str = "uintptr_t" , extract_bits : bool = False ) -> None :
306
- assert any (var .name == var_name for var in self .outputs )
298
+ def flush_single_var (self , out : CWriter , var_name : str , outputs : list [StackItem ],
299
+ cast_type : str = "uintptr_t" , extract_bits : bool = False ) -> None :
300
+ assert any (var .name == var_name for var in outputs )
307
301
base_offset = self .base_offset .copy ()
308
302
top_offset = self .top_offset .copy ()
309
303
for var in self .variables :
310
- base_offset .push (var .item )
311
- for var in self .outputs :
304
+ base_offset .push (var )
305
+ for var in outputs :
306
+ if any (var == v .item for v in self .variables ):
307
+ # The variable is already on the stack, such as a peeked value
308
+ # in the tier1 generator
309
+ continue
312
310
if var .name == var_name :
313
- var .cached = False
314
311
Stack ._do_emit (out , var , base_offset , cast_type , extract_bits )
315
- base_offset .push (var . item )
316
- top_offset .push (var . item )
312
+ base_offset .push (var )
313
+ top_offset .push (var )
317
314
if base_offset .to_c () != top_offset .to_c ():
318
315
print ("base" , base_offset , "top" , top_offset )
319
316
assert False
0 commit comments