@@ -445,7 +445,6 @@ class Storage:
445445 peeks : int
446446 check_liveness : bool
447447 spilled : int = 0
448- tmp_defined : bool = False
449448
450449 @staticmethod
451450 def needs_defining (var : Local ) -> bool :
@@ -475,16 +474,6 @@ def clear_inputs(self, reason:str) -> None:
475474 )
476475 self .stack .drop (tos .item , self .check_liveness )
477476
478- def clear_inputs_and_close_live_ones (self , out : CWriter ) -> None :
479- while len (self .inputs ) > self .peeks :
480- tos = self .inputs .pop ()
481- if self .is_live (tos ):
482- self .close_variable (out , tos , "PyStackRef_NULL" )
483- tos .kill ()
484- out .start_line ()
485- self .stack .drop (tos .item , self .check_liveness )
486-
487-
488477 def clear_dead_inputs (self ) -> None :
489478 live = ""
490479 while len (self .inputs ) > self .peeks :
@@ -666,43 +655,43 @@ def _print(self, out: CWriter) -> None:
666655 if PRINT_STACKS :
667656 out .emit (self .as_comment () + "\n " )
668657
669- def close_named (self , out : CWriter , close : str , name : str , overwrite : str ) -> None :
670- if overwrite :
671- if not self .tmp_defined :
672- out .emit ("_PyStackRef " )
673- self .tmp_defined = True
674- out .emit (f"tmp = { name } ;\n " )
675- out .emit (f"{ name } = { overwrite } ;\n " )
676- self .stack .save_variables (out )
677- out .emit (f"{ close } (tmp);\n " )
678- else :
679- out .emit (f"{ close } ({ name } );\n " )
680-
681- def close_variable (self , out : CWriter , var : Local , overwrite : str ) -> None :
682- close = "PyStackRef_CLOSE"
683- if "null" in var .name :
684- close = "PyStackRef_XCLOSE"
685- var .memory_offset = None
686- self .save (out )
687- out .start_line ()
688- if var .size :
689- if var .size == "1" :
690- self .close_named (out , close , f"{ var .name } [0]" , overwrite )
691- else :
692- if overwrite and not self .tmp_defined :
693- out .emit ("_PyStackRef tmp;\n " )
694- self .tmp_defined = True
695- out .emit (f"for (int _i = { var .size } ; --_i >= 0;) {{\n " )
696- self .close_named (out , close , f"{ var .name } [_i]" , overwrite )
697- out .emit ("}\n " )
698- else :
699- self .close_named (out , close , var .name , overwrite )
700- self .reload (out )
701-
702-
703658 def close_inputs (self , out : CWriter ) -> None :
704659
705660 tmp_defined = False
661+ def close_named (close : str , name : str , overwrite : str ) -> None :
662+ nonlocal tmp_defined
663+ if overwrite :
664+ if not tmp_defined :
665+ out .emit ("_PyStackRef " )
666+ tmp_defined = True
667+ out .emit (f"tmp = { name } ;\n " )
668+ out .emit (f"{ name } = { overwrite } ;\n " )
669+ self .stack .save_variables (out )
670+ out .emit (f"{ close } (tmp);\n " )
671+ else :
672+ out .emit (f"{ close } ({ name } );\n " )
673+
674+ def close_variable (var : Local , overwrite : str ) -> None :
675+ nonlocal tmp_defined
676+ close = "PyStackRef_CLOSE"
677+ if "null" in var .name :
678+ close = "PyStackRef_XCLOSE"
679+ var .memory_offset = None
680+ self .save (out )
681+ out .start_line ()
682+ if var .size :
683+ if var .size == "1" :
684+ close_named (close , f"{ var .name } [0]" , overwrite )
685+ else :
686+ if overwrite and not tmp_defined :
687+ out .emit ("_PyStackRef tmp;\n " )
688+ tmp_defined = True
689+ out .emit (f"for (int _i = { var .size } ; --_i >= 0;) {{\n " )
690+ close_named (close , f"{ var .name } [_i]" , overwrite )
691+ out .emit ("}\n " )
692+ else :
693+ close_named (close , var .name , overwrite )
694+ self .reload (out )
706695
707696 self .clear_dead_inputs ()
708697 if not self .inputs :
@@ -724,20 +713,20 @@ def close_inputs(self, out: CWriter) -> None:
724713 self .stack .drop (self .inputs [0 ].item , False )
725714 self .stack .push (output )
726715 self .stack .flush (out )
727- self . close_variable (out , self .inputs [0 ], "" )
716+ close_variable (self .inputs [0 ], "" )
728717 self .stack .drop (output .item , self .check_liveness )
729718 self .inputs = []
730719 return
731720 if var_size (lowest .item ) != var_size (output .item ):
732721 raise StackError ("Cannot call DECREF_INPUTS with live output not matching first input size" )
733722 self .stack .flush (out )
734723 lowest .in_local = True
735- self . close_variable (out , lowest , output .name )
724+ close_variable (lowest , output .name )
736725 assert lowest .memory_offset is not None
737726 for input in reversed (self .inputs [1 :]):
738- self . close_variable (out , input , "PyStackRef_NULL" )
727+ close_variable (input , "PyStackRef_NULL" )
739728 if output is None :
740- self . close_variable (out , self .inputs [0 ], "PyStackRef_NULL" )
729+ close_variable (self .inputs [0 ], "PyStackRef_NULL" )
741730 for input in reversed (self .inputs [1 :]):
742731 input .kill ()
743732 self .stack .drop (input .item , self .check_liveness )
0 commit comments