@@ -224,13 +224,14 @@ def array_or_scalar(var: StackItem | Local) -> str:
224
224
return "array" if var .is_array () else "scalar"
225
225
226
226
class Stack :
227
- def __init__ (self ) -> None :
227
+ def __init__ (self , extract_bits : bool = True ) -> None :
228
228
self .top_offset = StackOffset .empty ()
229
229
self .base_offset = StackOffset .empty ()
230
230
self .variables : list [Local ] = []
231
231
self .defined : set [str ] = set ()
232
+ self .extract_bits = extract_bits
232
233
233
- def pop (self , var : StackItem , extract_bits : bool = True ) -> tuple [str , Local ]:
234
+ def pop (self , var : StackItem ) -> tuple [str , Local ]:
234
235
self .top_offset .pop (var )
235
236
indirect = "&" if var .is_array () else ""
236
237
if self .variables :
@@ -272,7 +273,7 @@ def pop(self, var: StackItem, extract_bits: bool = True) -> tuple[str, Local]:
272
273
return "" , Local .unused (var )
273
274
self .defined .add (var .name )
274
275
cast = f"({ var .type } )" if (not indirect and var .type ) else ""
275
- bits = ".bits" if cast and extract_bits else ""
276
+ bits = ".bits" if cast and self . extract_bits else ""
276
277
assign = f"{ var .name } = { cast } { indirect } stack_pointer[{ self .base_offset .to_c ()} ]{ bits } ;"
277
278
if var .condition :
278
279
if var .condition == "1" :
@@ -315,7 +316,7 @@ def _adjust_stack_pointer(self, out: CWriter, number: str) -> None:
315
316
out .emit ("assert(WITHIN_STACK_BOUNDS());\n " )
316
317
317
318
def flush (
318
- self , out : CWriter , cast_type : str = "uintptr_t" , extract_bits : bool = True
319
+ self , out : CWriter , cast_type : str = "uintptr_t"
319
320
) -> None :
320
321
out .start_line ()
321
322
var_offset = self .base_offset .copy ()
@@ -324,7 +325,7 @@ def flush(
324
325
var .defined and
325
326
not var .in_memory
326
327
):
327
- Stack ._do_emit (out , var .item , var_offset , cast_type , extract_bits )
328
+ Stack ._do_emit (out , var .item , var_offset , cast_type , self . extract_bits )
328
329
var .in_memory = True
329
330
var_offset .push (var .item )
330
331
number = self .top_offset .to_c ()
@@ -346,7 +347,7 @@ def as_comment(self) -> str:
346
347
)
347
348
348
349
def copy (self ) -> "Stack" :
349
- other = Stack ()
350
+ other = Stack (self . extract_bits )
350
351
other .top_offset = self .top_offset .copy ()
351
352
other .base_offset = self .base_offset .copy ()
352
353
other .variables = [var .copy () for var in self .variables ]
@@ -507,10 +508,10 @@ def locals_cached(self) -> bool:
507
508
return True
508
509
return False
509
510
510
- def flush (self , out : CWriter , cast_type : str = "uintptr_t" , extract_bits : bool = True ) -> None :
511
+ def flush (self , out : CWriter , cast_type : str = "uintptr_t" ) -> None :
511
512
self .clear_dead_inputs ()
512
513
self ._push_defined_outputs ()
513
- self .stack .flush (out , cast_type , extract_bits )
514
+ self .stack .flush (out , cast_type )
514
515
515
516
def save (self , out : CWriter ) -> None :
516
517
assert self .spilled >= 0
@@ -530,12 +531,12 @@ def reload(self, out: CWriter) -> None:
530
531
out .emit ("stack_pointer = _PyFrame_GetStackPointer(frame);\n " )
531
532
532
533
@staticmethod
533
- def for_uop (stack : Stack , uop : Uop , extract_bits : bool = True ) -> tuple [list [str ], "Storage" ]:
534
+ def for_uop (stack : Stack , uop : Uop ) -> tuple [list [str ], "Storage" ]:
534
535
code_list : list [str ] = []
535
536
inputs : list [Local ] = []
536
537
peeks : list [Local ] = []
537
538
for input in reversed (uop .stack .inputs ):
538
- code , local = stack .pop (input , extract_bits )
539
+ code , local = stack .pop (input )
539
540
code_list .append (code )
540
541
if input .peek :
541
542
peeks .append (local )
0 commit comments