@@ -318,6 +318,10 @@ def get_logical_instruction_at_offset(
318318 # raw name index for LOAD_GLOBAL, LOAD_CONST, etc.
319319
320320 argval = arg
321+
322+ # create a localsplusnames table that resolves duplicates.
323+ localsplusnames = (varnames or tuple ()) + tuple (name for name in (cells or tuple ()) if name not in varnames )
324+
321325 if op in opc .CONST_OPS :
322326 argval , argrepr = _get_const_info (arg , constants )
323327 elif op in opc .NAME_OPS :
@@ -340,6 +344,12 @@ def get_logical_instruction_at_offset(
340344 elif op in opc .JREL_OPS :
341345 signed_arg = - arg if "JUMP_BACKWARD" in opname else arg
342346 argval = i + get_jump_val (signed_arg , opc .python_version )
347+
348+ # check cache instructions for python 3.13
349+ if opc .version_tuple >= (3 , 13 ):
350+ if opc .opname [op ] in ["POP_JUMP_IF_TRUE" , "POP_JUMP_IF_FALSE" , "POP_JUMP_IF_NONE" , "POP_JUMP_IF_NOT_NONE" , "JUMP_BACKWARD" ]:
351+ argval += 2
352+
343353 # FOR_ITER has a cache instruction in 3.12
344354 if opc .version_tuple >= (3 , 12 ) and opname == "FOR_ITER" :
345355 argval += 2
@@ -351,28 +361,24 @@ def get_logical_instruction_at_offset(
351361 if opc .version_tuple >= (3 , 13 ) and opname in ("LOAD_FAST_LOAD_FAST" , "STORE_FAST_LOAD_FAST" , "STORE_FAST_STORE_FAST" ):
352362 arg1 = arg >> 4
353363 arg2 = arg & 15
354- argval1 , argrepr1 = _get_name_info (arg1 , ( varnames or tuple ()) + ( cells or tuple ()) )
355- argval2 , argrepr2 = _get_name_info (arg2 , ( varnames or tuple ()) + ( cells or tuple ()) )
364+ argval1 , argrepr1 = _get_name_info (arg1 , localsplusnames )
365+ argval2 , argrepr2 = _get_name_info (arg2 , localsplusnames )
356366 argval = argval1 , argval2
357367 argrepr = argrepr1 + ", " + argrepr2
358368 elif opc .version_tuple >= (3 , 11 ):
359- argval , argrepr = _get_name_info (
360- arg , (varnames or tuple ()) + (cells or tuple ())
361- )
369+ argval , argrepr = _get_name_info (arg , localsplusnames )
362370 else :
363371 argval , argrepr = _get_name_info (arg , varnames )
364372 elif op in opc .FREE_OPS :
365373 if opc .version_tuple >= (3 , 11 ):
366- argval , argrepr = _get_name_info (
367- arg , (varnames or tuple ()) + (cells or tuple ())
368- )
374+ argval , argrepr = _get_name_info (arg , localsplusnames )
369375 else :
370376 argval , argrepr = _get_name_info (arg , cells )
371377 elif op in opc .COMPARE_OPS :
372- if opc .python_version >= (3 ,13 ):
378+ if opc .python_version >= (3 , 13 ):
373379 # The fifth-lowest bit of the oparg now indicates a forced conversion to bool.
374380 argval = (opc .cmp_op [arg >> 5 ])
375- elif opc .python_version >= (3 ,12 ):
381+ elif opc .python_version >= (3 , 12 ):
376382 argval = (opc .cmp_op [arg >> 4 ])
377383 else :
378384 argval = (opc .cmp_op [arg ])
0 commit comments