• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2"""
3opcode module - potentially shared between dis and other modules which
4operate on bytecodes (e.g. peephole optimizers).
5"""
6
7
8__all__ = ["cmp_op", "stack_effect", "hascompare", "opname", "opmap",
9           "HAVE_ARGUMENT", "EXTENDED_ARG", "hasarg", "hasconst", "hasname",
10           "hasjump", "hasjrel", "hasjabs", "hasfree", "haslocal", "hasexc"]
11
12import _opcode
13from _opcode import stack_effect
14
15from _opcode_metadata import (_specializations, _specialized_opmap, opmap,
16                              HAVE_ARGUMENT, MIN_INSTRUMENTED_OPCODE)
17EXTENDED_ARG = opmap['EXTENDED_ARG']
18
19opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)]
20for op, i in opmap.items():
21    opname[i] = op
22
23cmp_op = ('<', '<=', '==', '!=', '>', '>=')
24
25# These lists are documented as part of the dis module's API
26hasarg = [op for op in opmap.values() if _opcode.has_arg(op)]
27hasconst = [op for op in opmap.values() if _opcode.has_const(op)]
28hasname = [op for op in opmap.values() if _opcode.has_name(op)]
29hasjump = [op for op in opmap.values() if _opcode.has_jump(op)]
30hasjrel = hasjump  # for backward compatibility
31hasjabs = []
32hasfree = [op for op in opmap.values() if _opcode.has_free(op)]
33haslocal = [op for op in opmap.values() if _opcode.has_local(op)]
34hasexc = [op for op in opmap.values() if _opcode.has_exc(op)]
35
36
37_intrinsic_1_descs = _opcode.get_intrinsic1_descs()
38_intrinsic_2_descs = _opcode.get_intrinsic2_descs()
39_nb_ops = _opcode.get_nb_ops()
40
41hascompare = [opmap["COMPARE_OP"]]
42
43_cache_format = {
44    "LOAD_GLOBAL": {
45        "counter": 1,
46        "index": 1,
47        "module_keys_version": 1,
48        "builtin_keys_version": 1,
49    },
50    "BINARY_OP": {
51        "counter": 1,
52    },
53    "UNPACK_SEQUENCE": {
54        "counter": 1,
55    },
56    "COMPARE_OP": {
57        "counter": 1,
58    },
59    "CONTAINS_OP": {
60        "counter": 1,
61    },
62    "BINARY_SUBSCR": {
63        "counter": 1,
64    },
65    "FOR_ITER": {
66        "counter": 1,
67    },
68    "LOAD_SUPER_ATTR": {
69        "counter": 1,
70    },
71    "LOAD_ATTR": {
72        "counter": 1,
73        "version": 2,
74        "keys_version": 2,
75        "descr": 4,
76    },
77    "STORE_ATTR": {
78        "counter": 1,
79        "version": 2,
80        "index": 1,
81    },
82    "CALL": {
83        "counter": 1,
84        "func_version": 2,
85    },
86    "STORE_SUBSCR": {
87        "counter": 1,
88    },
89    "SEND": {
90        "counter": 1,
91    },
92    "JUMP_BACKWARD": {
93        "counter": 1,
94    },
95    "TO_BOOL": {
96        "counter": 1,
97        "version": 2,
98    },
99    "POP_JUMP_IF_TRUE": {
100        "counter": 1,
101    },
102    "POP_JUMP_IF_FALSE": {
103        "counter": 1,
104    },
105    "POP_JUMP_IF_NONE": {
106        "counter": 1,
107    },
108    "POP_JUMP_IF_NOT_NONE": {
109        "counter": 1,
110    },
111}
112
113_inline_cache_entries = {
114    name : sum(value.values()) for (name, value) in _cache_format.items()
115}
116