@@ -2394,6 +2394,38 @@ def optimize(p):
23942394##############################################################################
23952395# A symbolic pickle disassembler.
23962396
2397+ # Group opcode names into categories for colourised CLI output.
2398+ _opcode_categories = frozendict (
2399+ op_call = frozenset ({
2400+ "BUILD" , "EXT1" , "EXT2" , "EXT4" , "GLOBAL" , "INST" , "NEWOBJ" ,
2401+ "NEWOBJ_EX" , "OBJ" , "REDUCE" , "STACK_GLOBAL" ,
2402+ }),
2403+ op_container = frozenset ({
2404+ "ADDITEMS" , "APPEND" , "APPENDS" , "DICT" , "EMPTY_DICT" , "EMPTY_LIST" ,
2405+ "EMPTY_SET" , "EMPTY_TUPLE" , "FROZENSET" , "LIST" , "SETITEM" ,
2406+ "SETITEMS" , "TUPLE" , "TUPLE1" , "TUPLE2" , "TUPLE3" ,
2407+ }),
2408+ op_literal = frozenset ({
2409+ "BINBYTES" , "BINBYTES8" , "BINFLOAT" , "BININT" , "BININT1" , "BININT2" ,
2410+ "BINSTRING" , "BINUNICODE" , "BINUNICODE8" , "BYTEARRAY8" , "FLOAT" ,
2411+ "INT" , "LONG" , "LONG1" , "LONG4" , "NEWFALSE" , "NEWTRUE" , "NEXT_BUFFER" ,
2412+ "NONE" , "READONLY_BUFFER" , "SHORT_BINBYTES" , "SHORT_BINSTRING" ,
2413+ "SHORT_BINUNICODE" , "STRING" , "UNICODE" ,
2414+ }),
2415+ op_memo = frozenset ({
2416+ "BINGET" , "BINPUT" , "GET" , "LONG_BINGET" , "LONG_BINPUT" , "MEMOIZE" ,
2417+ "PUT" ,
2418+ }),
2419+ op_meta = frozenset ({"BINPERSID" , "FRAME" , "PERSID" , "PROTO" }),
2420+ op_stack = frozenset ({"DUP" , "MARK" , "POP" , "POP_MARK" , "STOP" }),
2421+ )
2422+ _opcode_color_attr = frozendict ({
2423+ name : attr
2424+ for attr , names in _opcode_categories .items ()
2425+ for name in names
2426+ })
2427+
2428+
23972429def dis (pickle , out = None , memo = None , indentlevel = 4 , annotate = 0 ):
23982430 """Produce a symbolic disassembly of a pickle.
23992431
@@ -2450,10 +2482,13 @@ def dis(pickle, out=None, memo=None, indentlevel=4, annotate=0):
24502482 if pos is not None :
24512483 print (f"{ t .position } { pos :5d} :{ t .reset } " , end = ' ' , file = out )
24522484
2485+ opcode_color = getattr (
2486+ t , _opcode_color_attr .get (opcode .name , "op_meta" )
2487+ )
24532488 line = (
24542489 f"{ t .opcode_code } { repr (opcode .code )[1 :- 1 ]:<4} { t .reset } "
24552490 f"{ indentchunk * len (markstack )} "
2456- f"{ t . opcode_name } { opcode .name } { t .reset } "
2491+ f"{ opcode_color } { opcode .name } { t .reset } "
24572492 )
24582493
24592494 maxproto = max (maxproto , opcode .proto )
0 commit comments