@@ -305,16 +305,8 @@ def __init__(
305305 self .names = list (names )
306306 self .varnames = list (varnames )
307307 self .exception_table = exception_table or []
308- for instr in instructions :
309- self ._check_instr (instr )
310308 self .extend (instructions )
311309
312- def __iter__ (self ) -> Iterator [Union [ConcreteInstr , SetLineno ]]:
313- instructions = super ().__iter__ ()
314- for instr in instructions :
315- self ._check_instr (instr )
316- yield instr
317-
318310 def _check_instr (self , instr : Any ) -> None :
319311 if not isinstance (instr , (ConcreteInstr , SetLineno )):
320312 raise ValueError (
@@ -1036,7 +1028,9 @@ def __init__(self, code: _bytecode.Bytecode) -> None:
10361028 self .consts_indices : dict [bytes | Tuple [type , int ], int ] = {}
10371029 self .consts_list : list [Any ] = []
10381030 self .names : list [str ] = []
1031+ self .names_map : dict [str , int ] = {}
10391032 self .varnames : list [str ] = []
1033+ self .varnames_map : dict [str , int ] = {}
10401034
10411035 def add_const (self , value : Any ) -> int :
10421036 key = const_key (value )
@@ -1047,13 +1041,20 @@ def add_const(self, value: Any) -> int:
10471041 self .consts_list .append (value )
10481042 return index
10491043
1050- @staticmethod
1051- def add (names : list [str ], name : str ) -> int :
1052- try :
1053- index = names .index (name )
1054- except ValueError :
1055- index = len (names )
1056- names .append (name )
1044+ def add_name (self , name : str ) -> int :
1045+ index = self .names_map .get (name )
1046+ if index is None :
1047+ index = len (self .names )
1048+ self .names_map [name ] = index
1049+ self .names .append (name )
1050+ return index
1051+
1052+ def add_varname (self , name : str ) -> int :
1053+ index = self .varnames_map .get (name )
1054+ if index is None :
1055+ index = len (self .varnames )
1056+ self .varnames_map [name ] = index
1057+ self .varnames .append (name )
10571058 return index
10581059
10591060 def concrete_instructions (self ) -> None :
@@ -1074,7 +1075,7 @@ def concrete_instructions(self) -> None:
10741075 assert isinstance (binstr .arg , tuple )
10751076 for parg in binstr .arg :
10761077 assert isinstance (parg , str )
1077- self .add ( self . varnames , parg )
1078+ self .add_varname ( parg )
10781079
10791080 # We use None as a sentinel to ensure caches for the last instruction are
10801081 # properly generated.
@@ -1158,8 +1159,8 @@ def concrete_instructions(self) -> None:
11581159 elif opcode in HAS_LOCAL :
11591160 if opcode in DUAL_ARG_OPCODES :
11601161 _arg2 = cast (Tuple [str , str ], arg )
1161- arg1_index = self .add ( self . varnames , _arg2 [0 ])
1162- arg2_index = self .add ( self . varnames , _arg2 [1 ])
1162+ arg1_index = self .add_varname ( _arg2 [0 ])
1163+ arg2_index = self .add_varname ( _arg2 [1 ])
11631164 if arg1_index > 16 or arg2_index > 16 :
11641165 n1 , n2 = DUAL_ARG_OPCODES_SINGLE_OPS [opcode ]
11651166 c_instr = ConcreteInstr (n1 , arg1_index , location = location )
@@ -1176,7 +1177,7 @@ def concrete_instructions(self) -> None:
11761177 c_arg = self .bytecode .freevars .index (arg .name )
11771178 else :
11781179 assert isinstance (arg , str )
1179- c_arg = self .add ( self . varnames , arg )
1180+ c_arg = self .add_varname ( arg )
11801181 elif opcode in HAS_NAME :
11811182 if opcode in BITFLAG_OPCODES :
11821183 assert (
@@ -1185,19 +1186,19 @@ def concrete_instructions(self) -> None:
11851186 and isinstance (arg [0 ], bool )
11861187 ), arg
11871188 if isinstance (arg [1 ], str ):
1188- index = self .add ( self . names , arg [1 ])
1189+ index = self .add_name ( arg [1 ])
11891190 elif isinstance (arg , FormatValue ):
11901191 index = int (arg )
11911192 else :
11921193 assert False , arg # noqa
11931194 c_arg = int (arg [0 ]) + (index << 1 )
11941195 elif opcode in BITFLAG2_OPCODES :
11951196 _arg3 = cast (tuple [bool , bool , str ], arg )
1196- index = self .add ( self . names , _arg3 [2 ])
1197+ index = self .add_name ( _arg3 [2 ])
11971198 c_arg = int (_arg3 [0 ]) + 2 * int (_arg3 [1 ]) + (index << 2 )
11981199 else :
11991200 assert isinstance (arg , str ), f"Got { arg } , expected a str"
1200- c_arg = self .add ( self . names , arg )
1201+ c_arg = self .add_name ( arg )
12011202 elif opcode in HAS_FREE :
12021203 if isinstance (arg , CellVar ):
12031204 cell_instrs .append (len (self .instructions ))
@@ -1342,7 +1343,8 @@ def to_concrete_bytecode(
13421343 if first_const is not UNSET :
13431344 self .add_const (first_const )
13441345
1345- self .varnames .extend (self .bytecode .argnames )
1346+ for name in self .bytecode .argnames :
1347+ self .add_varname (name )
13461348
13471349 self .concrete_instructions ()
13481350 for _ in range (0 , compute_jumps_passes ):
0 commit comments