@@ -273,15 +273,15 @@ def get_instructions(x, *, first_line=None):
273273 the disassembled code object.
274274 """
275275 co = _get_code_object (x )
276- cell_names = co .co_cellvars + co .co_freevars
277276 linestarts = dict (findlinestarts (co ))
278277 if first_line is not None :
279278 line_offset = first_line - co .co_firstlineno
280279 else :
281280 line_offset = 0
282- return _get_instructions_bytes (co .co_code , co .co_varnames , co .co_names ,
283- co .co_consts , cell_names , linestarts ,
284- line_offset )
281+ return _get_instructions_bytes (co .co_code ,
282+ co ._varname_from_oparg ,
283+ co .co_names , co .co_consts ,
284+ linestarts , line_offset )
285285
286286def _get_const_info (const_index , const_list ):
287287 """Helper to get optional details about const references
@@ -295,16 +295,16 @@ def _get_const_info(const_index, const_list):
295295 argval = const_list [const_index ]
296296 return argval , repr (argval )
297297
298- def _get_name_info (name_index , name_list ):
298+ def _get_name_info (name_index , get_name , ** extrainfo ):
299299 """Helper to get optional details about named references
300300
301301 Returns the dereferenced name as both value and repr if the name
302302 list is defined.
303303 Otherwise returns the name index and its repr().
304304 """
305305 argval = name_index
306- if name_list is not None :
307- argval = name_list [ name_index ]
306+ if get_name is not None :
307+ argval = get_name ( name_index , ** extrainfo )
308308 argrepr = argval
309309 else :
310310 argrepr = repr (argval )
@@ -336,8 +336,10 @@ def parse_exception_table(code):
336336 except StopIteration :
337337 return entries
338338
339- def _get_instructions_bytes (code , varnames = None , names = None , constants = None ,
340- cells = None , linestarts = None , line_offset = 0 , exception_entries = ()):
339+ def _get_instructions_bytes (code , varname_from_oparg = None ,
340+ names = None , constants = None ,
341+ linestarts = None , line_offset = 0 ,
342+ exception_entries = ()):
341343 """Iterate over the instructions in a bytecode string.
342344
343345 Generates a sequence of Instruction namedtuples giving the details of each
@@ -346,6 +348,7 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None,
346348 arguments.
347349
348350 """
351+ get_name = None if names is None else names .__getitem__
349352 labels = set (findlabels (code ))
350353 for start , end , target , _ , _ in exception_entries :
351354 for i in range (start , end ):
@@ -368,20 +371,18 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None,
368371 if op in hasconst :
369372 argval , argrepr = _get_const_info (arg , constants )
370373 elif op in hasname :
371- argval , argrepr = _get_name_info (arg , names )
374+ argval , argrepr = _get_name_info (arg , get_name )
372375 elif op in hasjabs :
373376 argval = arg * 2
374377 argrepr = "to " + repr (argval )
375378 elif op in hasjrel :
376379 argval = offset + 2 + arg * 2
377380 argrepr = "to " + repr (argval )
378- elif op in haslocal :
379- argval , argrepr = _get_name_info (arg , varnames )
381+ elif op in haslocal or op in hasfree :
382+ argval , argrepr = _get_name_info (arg , varname_from_oparg )
380383 elif op in hascompare :
381384 argval = cmp_op [arg ]
382385 argrepr = argval
383- elif op in hasfree :
384- argval , argrepr = _get_name_info (arg , cells )
385386 elif op == FORMAT_VALUE :
386387 argval , argrepr = FORMAT_VALUE_CONVERTERS [arg & 0x3 ]
387388 argval = (argval , bool (arg & 0x4 ))
@@ -398,11 +399,11 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None,
398399
399400def disassemble (co , lasti = - 1 , * , file = None ):
400401 """Disassemble a code object."""
401- cell_names = co .co_cellvars + co .co_freevars
402402 linestarts = dict (findlinestarts (co ))
403403 exception_entries = parse_exception_table (co )
404- _disassemble_bytes (co .co_code , lasti , co .co_varnames , co .co_names ,
405- co .co_consts , cell_names , linestarts , file = file ,
404+ _disassemble_bytes (co .co_code , lasti ,
405+ co ._varname_from_oparg ,
406+ co .co_names , co .co_consts , linestarts , file = file ,
406407 exception_entries = exception_entries )
407408
408409def _disassemble_recursive (co , * , file = None , depth = None ):
@@ -416,8 +417,8 @@ def _disassemble_recursive(co, *, file=None, depth=None):
416417 print ("Disassembly of %r:" % (x ,), file = file )
417418 _disassemble_recursive (x , file = file , depth = depth )
418419
419- def _disassemble_bytes (code , lasti = - 1 , varnames = None , names = None ,
420- constants = None , cells = None , linestarts = None ,
420+ def _disassemble_bytes (code , lasti = - 1 , varname_from_oparg = None ,
421+ names = None , constants = None , linestarts = None ,
421422 * , file = None , line_offset = 0 , exception_entries = ()):
422423 # Omit the line number column entirely if we have no line number info
423424 show_lineno = bool (linestarts )
@@ -434,8 +435,8 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
434435 offset_width = len (str (maxoffset ))
435436 else :
436437 offset_width = 4
437- for instr in _get_instructions_bytes (code , varnames , names ,
438- constants , cells , linestarts ,
438+ for instr in _get_instructions_bytes (code , varname_from_oparg , names ,
439+ constants , linestarts ,
439440 line_offset = line_offset , exception_entries = exception_entries ):
440441 new_source_line = (show_lineno and
441442 instr .starts_line is not None and
@@ -517,16 +518,16 @@ def __init__(self, x, *, first_line=None, current_offset=None):
517518 else :
518519 self .first_line = first_line
519520 self ._line_offset = first_line - co .co_firstlineno
520- self ._cell_names = co .co_cellvars + co .co_freevars
521521 self ._linestarts = dict (findlinestarts (co ))
522522 self ._original_object = x
523523 self .current_offset = current_offset
524524 self .exception_entries = parse_exception_table (co )
525525
526526 def __iter__ (self ):
527527 co = self .codeobj
528- return _get_instructions_bytes (co .co_code , co .co_varnames , co .co_names ,
529- co .co_consts , self ._cell_names ,
528+ return _get_instructions_bytes (co .co_code ,
529+ co ._varname_from_oparg ,
530+ co .co_names , co .co_consts ,
530531 self ._linestarts ,
531532 line_offset = self ._line_offset ,
532533 exception_entries = self .exception_entries )
@@ -554,9 +555,9 @@ def dis(self):
554555 else :
555556 offset = - 1
556557 with io .StringIO () as output :
557- _disassemble_bytes (co .co_code , varnames = co .co_varnames ,
558+ _disassemble_bytes (co .co_code ,
559+ varname_from_oparg = co ._varname_from_oparg ,
558560 names = co .co_names , constants = co .co_consts ,
559- cells = self ._cell_names ,
560561 linestarts = self ._linestarts ,
561562 line_offset = self ._line_offset ,
562563 file = output ,
0 commit comments