Skip to content

Commit 35d1088

Browse files
committed
Categorise opcodes
1 parent 799601e commit 35d1088

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

Lib/_colorize.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,13 @@ class Pickletools(ThemeSection):
365365
arg_number: str = ANSIColors.YELLOW
366366
arg_string: str = ANSIColors.GREEN
367367
mark: str = ANSIColors.GREY
368+
op_call: str = ANSIColors.GREEN
369+
op_container: str = ANSIColors.INTENSE_BLUE
370+
op_literal: str = ANSIColors.CYAN
371+
op_memo: str = ANSIColors.MAGENTA
372+
op_meta: str = ANSIColors.GREY
373+
op_stack: str = ANSIColors.BOLD_RED
368374
opcode_code: str = ANSIColors.CYAN
369-
opcode_name: str = ANSIColors.BOLD_BLUE
370375
position: str = ANSIColors.GREY
371376
proto: str = ANSIColors.YELLOW
372377
reset: str = ANSIColors.RESET

Lib/pickletools.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
23972429
def 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

Comments
 (0)