Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | |
2 | """ | |
3 | opcode module - potentially shared between dis and other modules which | |
4 | operate on bytecodes (e.g. peephole optimizers). | |
5 | """ | |
6 | ||
7 | __all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs", | |
8 | "haslocal", "hascompare", "hasfree", "opname", "opmap", | |
9 | "HAVE_ARGUMENT", "EXTENDED_ARG"] | |
10 | ||
11 | cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', | |
12 | 'is not', 'exception match', 'BAD') | |
13 | ||
14 | hasconst = [] | |
15 | hasname = [] | |
16 | hasjrel = [] | |
17 | hasjabs = [] | |
18 | haslocal = [] | |
19 | hascompare = [] | |
20 | hasfree = [] | |
21 | ||
22 | opmap = {} | |
23 | opname = [''] * 256 | |
24 | for op in range(256): opname[op] = '<%r>' % (op,) | |
25 | del op | |
26 | ||
27 | def def_op(name, op): | |
28 | opname[op] = name | |
29 | opmap[name] = op | |
30 | ||
31 | def name_op(name, op): | |
32 | def_op(name, op) | |
33 | hasname.append(op) | |
34 | ||
35 | def jrel_op(name, op): | |
36 | def_op(name, op) | |
37 | hasjrel.append(op) | |
38 | ||
39 | def jabs_op(name, op): | |
40 | def_op(name, op) | |
41 | hasjabs.append(op) | |
42 | ||
43 | # Instruction opcodes for compiled code | |
44 | ||
45 | def_op('STOP_CODE', 0) | |
46 | def_op('POP_TOP', 1) | |
47 | def_op('ROT_TWO', 2) | |
48 | def_op('ROT_THREE', 3) | |
49 | def_op('DUP_TOP', 4) | |
50 | def_op('ROT_FOUR', 5) | |
51 | ||
52 | def_op('NOP', 9) | |
53 | def_op('UNARY_POSITIVE', 10) | |
54 | def_op('UNARY_NEGATIVE', 11) | |
55 | def_op('UNARY_NOT', 12) | |
56 | def_op('UNARY_CONVERT', 13) | |
57 | ||
58 | def_op('UNARY_INVERT', 15) | |
59 | ||
60 | def_op('LIST_APPEND', 18) | |
61 | def_op('BINARY_POWER', 19) | |
62 | ||
63 | def_op('BINARY_MULTIPLY', 20) | |
64 | def_op('BINARY_DIVIDE', 21) | |
65 | def_op('BINARY_MODULO', 22) | |
66 | def_op('BINARY_ADD', 23) | |
67 | def_op('BINARY_SUBTRACT', 24) | |
68 | def_op('BINARY_SUBSCR', 25) | |
69 | def_op('BINARY_FLOOR_DIVIDE', 26) | |
70 | def_op('BINARY_TRUE_DIVIDE', 27) | |
71 | def_op('INPLACE_FLOOR_DIVIDE', 28) | |
72 | def_op('INPLACE_TRUE_DIVIDE', 29) | |
73 | ||
74 | def_op('SLICE+0', 30) | |
75 | def_op('SLICE+1', 31) | |
76 | def_op('SLICE+2', 32) | |
77 | def_op('SLICE+3', 33) | |
78 | ||
79 | def_op('STORE_SLICE+0', 40) | |
80 | def_op('STORE_SLICE+1', 41) | |
81 | def_op('STORE_SLICE+2', 42) | |
82 | def_op('STORE_SLICE+3', 43) | |
83 | ||
84 | def_op('DELETE_SLICE+0', 50) | |
85 | def_op('DELETE_SLICE+1', 51) | |
86 | def_op('DELETE_SLICE+2', 52) | |
87 | def_op('DELETE_SLICE+3', 53) | |
88 | ||
89 | def_op('INPLACE_ADD', 55) | |
90 | def_op('INPLACE_SUBTRACT', 56) | |
91 | def_op('INPLACE_MULTIPLY', 57) | |
92 | def_op('INPLACE_DIVIDE', 58) | |
93 | def_op('INPLACE_MODULO', 59) | |
94 | def_op('STORE_SUBSCR', 60) | |
95 | def_op('DELETE_SUBSCR', 61) | |
96 | ||
97 | def_op('BINARY_LSHIFT', 62) | |
98 | def_op('BINARY_RSHIFT', 63) | |
99 | def_op('BINARY_AND', 64) | |
100 | def_op('BINARY_XOR', 65) | |
101 | def_op('BINARY_OR', 66) | |
102 | def_op('INPLACE_POWER', 67) | |
103 | def_op('GET_ITER', 68) | |
104 | ||
105 | def_op('PRINT_EXPR', 70) | |
106 | def_op('PRINT_ITEM', 71) | |
107 | def_op('PRINT_NEWLINE', 72) | |
108 | def_op('PRINT_ITEM_TO', 73) | |
109 | def_op('PRINT_NEWLINE_TO', 74) | |
110 | def_op('INPLACE_LSHIFT', 75) | |
111 | def_op('INPLACE_RSHIFT', 76) | |
112 | def_op('INPLACE_AND', 77) | |
113 | def_op('INPLACE_XOR', 78) | |
114 | def_op('INPLACE_OR', 79) | |
115 | def_op('BREAK_LOOP', 80) | |
116 | ||
117 | def_op('LOAD_LOCALS', 82) | |
118 | def_op('RETURN_VALUE', 83) | |
119 | def_op('IMPORT_STAR', 84) | |
120 | def_op('EXEC_STMT', 85) | |
121 | def_op('YIELD_VALUE', 86) | |
122 | ||
123 | def_op('POP_BLOCK', 87) | |
124 | def_op('END_FINALLY', 88) | |
125 | def_op('BUILD_CLASS', 89) | |
126 | ||
127 | HAVE_ARGUMENT = 90 # Opcodes from here have an argument: | |
128 | ||
129 | name_op('STORE_NAME', 90) # Index in name list | |
130 | name_op('DELETE_NAME', 91) # "" | |
131 | def_op('UNPACK_SEQUENCE', 92) # Number of tuple items | |
132 | jrel_op('FOR_ITER', 93) | |
133 | ||
134 | name_op('STORE_ATTR', 95) # Index in name list | |
135 | name_op('DELETE_ATTR', 96) # "" | |
136 | name_op('STORE_GLOBAL', 97) # "" | |
137 | name_op('DELETE_GLOBAL', 98) # "" | |
138 | def_op('DUP_TOPX', 99) # number of items to duplicate | |
139 | def_op('LOAD_CONST', 100) # Index in const list | |
140 | hasconst.append(100) | |
141 | name_op('LOAD_NAME', 101) # Index in name list | |
142 | def_op('BUILD_TUPLE', 102) # Number of tuple items | |
143 | def_op('BUILD_LIST', 103) # Number of list items | |
144 | def_op('BUILD_MAP', 104) # Always zero for now | |
145 | name_op('LOAD_ATTR', 105) # Index in name list | |
146 | def_op('COMPARE_OP', 106) # Comparison operator | |
147 | hascompare.append(106) | |
148 | name_op('IMPORT_NAME', 107) # Index in name list | |
149 | name_op('IMPORT_FROM', 108) # Index in name list | |
150 | ||
151 | jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip | |
152 | jrel_op('JUMP_IF_FALSE', 111) # "" | |
153 | jrel_op('JUMP_IF_TRUE', 112) # "" | |
154 | jabs_op('JUMP_ABSOLUTE', 113) # Target byte offset from beginning of code | |
155 | ||
156 | name_op('LOAD_GLOBAL', 116) # Index in name list | |
157 | ||
158 | jabs_op('CONTINUE_LOOP', 119) # Target address | |
159 | jrel_op('SETUP_LOOP', 120) # Distance to target address | |
160 | jrel_op('SETUP_EXCEPT', 121) # "" | |
161 | jrel_op('SETUP_FINALLY', 122) # "" | |
162 | ||
163 | def_op('LOAD_FAST', 124) # Local variable number | |
164 | haslocal.append(124) | |
165 | def_op('STORE_FAST', 125) # Local variable number | |
166 | haslocal.append(125) | |
167 | def_op('DELETE_FAST', 126) # Local variable number | |
168 | haslocal.append(126) | |
169 | ||
170 | def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) | |
171 | def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8) | |
172 | def_op('MAKE_FUNCTION', 132) # Number of args with default values | |
173 | def_op('BUILD_SLICE', 133) # Number of items | |
174 | ||
175 | def_op('MAKE_CLOSURE', 134) | |
176 | def_op('LOAD_CLOSURE', 135) | |
177 | hasfree.append(135) | |
178 | def_op('LOAD_DEREF', 136) | |
179 | hasfree.append(136) | |
180 | def_op('STORE_DEREF', 137) | |
181 | hasfree.append(137) | |
182 | ||
183 | def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8) | |
184 | def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) | |
185 | def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) | |
186 | ||
187 | def_op('EXTENDED_ARG', 143) | |
188 | EXTENDED_ARG = 143 | |
189 | ||
190 | del def_op, name_op, jrel_op, jabs_op |