this repo has no description
1# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2from .opcodebase import Opcode
3
4opcode: Opcode = Opcode()
5opcode.def_op("POP_TOP", 1)
6opcode.def_op("ROT_TWO", 2)
7opcode.def_op("ROT_THREE", 3)
8opcode.def_op("DUP_TOP", 4)
9opcode.def_op("DUP_TOP_TWO", 5)
10opcode.def_op("NOP", 9)
11opcode.def_op("UNARY_POSITIVE", 10)
12opcode.def_op("UNARY_NEGATIVE", 11)
13opcode.def_op("UNARY_NOT", 12)
14opcode.def_op("UNARY_INVERT", 15)
15opcode.def_op("BINARY_MATRIX_MULTIPLY", 16)
16opcode.def_op("INPLACE_MATRIX_MULTIPLY", 17)
17opcode.def_op("BINARY_POWER", 19)
18opcode.def_op("BINARY_MULTIPLY", 20)
19opcode.def_op("BINARY_MODULO", 22)
20opcode.def_op("BINARY_ADD", 23)
21opcode.def_op("BINARY_SUBTRACT", 24)
22opcode.def_op("BINARY_SUBSCR", 25)
23opcode.def_op("BINARY_FLOOR_DIVIDE", 26)
24opcode.def_op("BINARY_TRUE_DIVIDE", 27)
25opcode.def_op("INPLACE_FLOOR_DIVIDE", 28)
26opcode.def_op("INPLACE_TRUE_DIVIDE", 29)
27opcode.def_op("GET_AITER", 50)
28opcode.def_op("GET_ANEXT", 51)
29opcode.def_op("BEFORE_ASYNC_WITH", 52)
30opcode.def_op("INPLACE_ADD", 55)
31opcode.def_op("INPLACE_SUBTRACT", 56)
32opcode.def_op("INPLACE_MULTIPLY", 57)
33opcode.def_op("INPLACE_MODULO", 59)
34opcode.def_op("STORE_SUBSCR", 60)
35opcode.def_op("DELETE_SUBSCR", 61)
36opcode.def_op("BINARY_LSHIFT", 62)
37opcode.def_op("BINARY_RSHIFT", 63)
38opcode.def_op("BINARY_AND", 64)
39opcode.def_op("BINARY_XOR", 65)
40opcode.def_op("BINARY_OR", 66)
41opcode.def_op("INPLACE_POWER", 67)
42opcode.def_op("GET_ITER", 68)
43opcode.def_op("GET_YIELD_FROM_ITER", 69)
44opcode.def_op("PRINT_EXPR", 70)
45opcode.def_op("LOAD_BUILD_CLASS", 71)
46opcode.def_op("YIELD_FROM", 72)
47opcode.def_op("GET_AWAITABLE", 73)
48opcode.def_op("INPLACE_LSHIFT", 75)
49opcode.def_op("INPLACE_RSHIFT", 76)
50opcode.def_op("INPLACE_AND", 77)
51opcode.def_op("INPLACE_XOR", 78)
52opcode.def_op("INPLACE_OR", 79)
53opcode.def_op("BREAK_LOOP", 80)
54opcode.def_op("WITH_CLEANUP_START", 81)
55opcode.def_op("WITH_CLEANUP_FINISH", 82)
56opcode.def_op("RETURN_VALUE", 83)
57opcode.def_op("IMPORT_STAR", 84)
58opcode.def_op("SETUP_ANNOTATIONS", 85)
59opcode.def_op("YIELD_VALUE", 86)
60opcode.def_op("POP_BLOCK", 87)
61opcode.def_op("END_FINALLY", 88)
62opcode.def_op("POP_EXCEPT", 89)
63# Opcodes from here have an argument:
64opcode.name_op("STORE_NAME", 90) # Index in name list
65opcode.name_op("DELETE_NAME", 91) # ""
66opcode.def_op("UNPACK_SEQUENCE", 92) # Number of tuple items
67opcode.jrel_op("FOR_ITER", 93)
68opcode.def_op("UNPACK_EX", 94)
69opcode.name_op("STORE_ATTR", 95) # Index in name list
70opcode.name_op("DELETE_ATTR", 96) # ""
71opcode.name_op("STORE_GLOBAL", 97) # ""
72opcode.name_op("DELETE_GLOBAL", 98) # ""
73opcode.def_op("LOAD_CONST", 100) # Index in const list
74opcode.hasconst.add(100)
75opcode.name_op("LOAD_NAME", 101) # Index in name list
76opcode.def_op("BUILD_TUPLE", 102) # Number of tuple items
77opcode.def_op("BUILD_LIST", 103) # Number of list items
78opcode.def_op("BUILD_SET", 104) # Number of set items
79opcode.def_op("BUILD_MAP", 105) # Number of dict entries
80opcode.name_op("LOAD_ATTR", 106) # Index in name list
81opcode.def_op("COMPARE_OP", 107) # Comparison operator
82opcode.hascompare.add(107)
83opcode.name_op("IMPORT_NAME", 108) # Index in name list
84opcode.name_op("IMPORT_FROM", 109) # Index in name list
85opcode.jrel_op("JUMP_FORWARD", 110) # Number of bytes to skip
86opcode.jabs_op("JUMP_IF_FALSE_OR_POP", 111) # Target byte offset from beginning of code
87opcode.jabs_op("JUMP_IF_TRUE_OR_POP", 112) # ""
88opcode.jabs_op("JUMP_ABSOLUTE", 113) # ""
89opcode.jabs_op("POP_JUMP_IF_FALSE", 114) # ""
90opcode.jabs_op("POP_JUMP_IF_TRUE", 115) # ""
91opcode.name_op("LOAD_GLOBAL", 116) # Index in name list
92opcode.jabs_op("CONTINUE_LOOP", 119) # Target address
93opcode.jrel_op("SETUP_LOOP", 120) # Distance to target address
94opcode.jrel_op("SETUP_EXCEPT", 121) # ""
95opcode.jrel_op("SETUP_FINALLY", 122) # ""
96opcode.def_op("LOAD_FAST", 124) # Local variable number
97opcode.haslocal.add(124)
98opcode.def_op("STORE_FAST", 125) # Local variable number
99opcode.haslocal.add(125)
100opcode.def_op("DELETE_FAST", 126) # Local variable number
101opcode.haslocal.add(126)
102opcode.name_op("STORE_ANNOTATION", 127) # Index in name list
103opcode.def_op("RAISE_VARARGS", 130) # Number of raise arguments (1, 2, or 3)
104opcode.def_op("CALL_FUNCTION", 131) # #args
105opcode.def_op("MAKE_FUNCTION", 132) # Flags
106opcode.def_op("BUILD_SLICE", 133) # Number of items
107opcode.def_op("LOAD_CLOSURE", 135)
108opcode.hasfree.add(135)
109opcode.def_op("LOAD_DEREF", 136)
110opcode.hasfree.add(136)
111opcode.def_op("STORE_DEREF", 137)
112opcode.hasfree.add(137)
113opcode.def_op("DELETE_DEREF", 138)
114opcode.hasfree.add(138)
115opcode.def_op("CALL_FUNCTION_KW", 141) # #args + #kwargs
116opcode.def_op("CALL_FUNCTION_EX", 142) # Flags
117opcode.jrel_op("SETUP_WITH", 143)
118opcode.def_op("LIST_APPEND", 145)
119opcode.def_op("SET_ADD", 146)
120opcode.def_op("MAP_ADD", 147)
121opcode.def_op("LOAD_CLASSDEREF", 148)
122opcode.hasfree.add(148)
123opcode.def_op("EXTENDED_ARG", 144)
124opcode.def_op("BUILD_LIST_UNPACK", 149)
125opcode.def_op("BUILD_MAP_UNPACK", 150)
126opcode.def_op("BUILD_MAP_UNPACK_WITH_CALL", 151)
127opcode.def_op("BUILD_TUPLE_UNPACK", 152)
128opcode.def_op("BUILD_SET_UNPACK", 153)
129opcode.jrel_op("SETUP_ASYNC_WITH", 154)
130opcode.def_op("FORMAT_VALUE", 155)
131opcode.def_op("BUILD_CONST_KEY_MAP", 156)
132opcode.def_op("BUILD_STRING", 157)
133opcode.def_op("BUILD_TUPLE_UNPACK_WITH_CALL", 158)
134
135FVC_MASK = 0x3
136FVC_NONE = 0x0
137FVC_STR = 0x1
138FVC_REPR = 0x2
139FVC_ASCII = 0x3
140FVS_MASK = 0x4
141FVS_HAVE_SPEC = 0x4
142
143opcode.stack_effects.update(
144 NOP=0,
145 POP_TOP=-1,
146 ROT_TWO=0,
147 ROT_THREE=0,
148 DUP_TOP=1,
149 DUP_TOP_TWO=2,
150 UNARY_POSITIVE=0,
151 UNARY_NEGATIVE=0,
152 UNARY_NOT=0,
153 UNARY_INVERT=0,
154 SET_ADD=-1,
155 LIST_APPEND=-1,
156 MAP_ADD=-2,
157 BINARY_POWER=-1,
158 BINARY_MULTIPLY=-1,
159 BINARY_MATRIX_MULTIPLY=-1,
160 BINARY_MODULO=-1,
161 BINARY_ADD=-1,
162 BINARY_SUBTRACT=-1,
163 BINARY_SUBSCR=-1,
164 BINARY_FLOOR_DIVIDE=-1,
165 BINARY_TRUE_DIVIDE=-1,
166 INPLACE_FLOOR_DIVIDE=-1,
167 INPLACE_TRUE_DIVIDE=-1,
168 INPLACE_ADD=-1,
169 INPLACE_SUBTRACT=-1,
170 INPLACE_MULTIPLY=-1,
171 INPLACE_MATRIX_MULTIPLY=-1,
172 INPLACE_MODULO=-1,
173 STORE_SUBSCR=-3,
174 DELETE_SUBSCR=-2,
175 BINARY_LSHIFT=-1,
176 BINARY_RSHIFT=-1,
177 BINARY_AND=-1,
178 BINARY_XOR=-1,
179 BINARY_OR=-1,
180 INPLACE_POWER=-1,
181 GET_ITER=0,
182 PRINT_EXPR=-1,
183 LOAD_BUILD_CLASS=1,
184 INPLACE_LSHIFT=-1,
185 INPLACE_RSHIFT=-1,
186 INPLACE_AND=-1,
187 INPLACE_XOR=-1,
188 INPLACE_OR=-1,
189 BREAK_LOOP=0,
190 SETUP_WITH=7,
191 WITH_CLEANUP_START=1,
192 WITH_CLEANUP_FINISH=-1, # XXX Sometimes more
193 RETURN_VALUE=-1,
194 IMPORT_STAR=-1,
195 SETUP_ANNOTATIONS=0,
196 YIELD_VALUE=0,
197 YIELD_FROM=-1,
198 POP_BLOCK=0,
199 POP_EXCEPT=0, # -3 except if bad bytecode
200 END_FINALLY=-1, # or -2 or -3 if exception occurred
201 STORE_NAME=-1,
202 DELETE_NAME=0,
203 UNPACK_SEQUENCE=lambda oparg, jmp=0: oparg - 1,
204 UNPACK_EX=lambda oparg, jmp=0: (oparg & 0xFF) + (oparg >> 8),
205 FOR_ITER=1, # or -1, at end of iterator
206 STORE_ATTR=-2,
207 DELETE_ATTR=-1,
208 STORE_GLOBAL=-1,
209 DELETE_GLOBAL=0,
210 LOAD_CONST=1,
211 LOAD_NAME=1,
212 BUILD_TUPLE=lambda oparg, jmp=0: 1 - oparg,
213 BUILD_LIST=lambda oparg, jmp=0: 1 - oparg,
214 BUILD_SET=lambda oparg, jmp=0: 1 - oparg,
215 BUILD_STRING=lambda oparg, jmp=0: 1 - oparg,
216 BUILD_LIST_UNPACK=lambda oparg, jmp=0: 1 - oparg,
217 BUILD_TUPLE_UNPACK=lambda oparg, jmp=0: 1 - oparg,
218 BUILD_TUPLE_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg,
219 BUILD_SET_UNPACK=lambda oparg, jmp=0: 1 - oparg,
220 BUILD_MAP_UNPACK=lambda oparg, jmp=0: 1 - oparg,
221 BUILD_MAP_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg,
222 BUILD_MAP=lambda oparg, jmp=0: 1 - 2 * oparg,
223 BUILD_CONST_KEY_MAP=lambda oparg, jmp=0: -oparg,
224 LOAD_ATTR=0,
225 COMPARE_OP=-1,
226 IMPORT_NAME=-1,
227 IMPORT_FROM=1,
228 JUMP_FORWARD=0,
229 JUMP_IF_TRUE_OR_POP=0, # -1 if jump not taken
230 JUMP_IF_FALSE_OR_POP=0, # ""
231 JUMP_ABSOLUTE=0,
232 POP_JUMP_IF_FALSE=-1,
233 POP_JUMP_IF_TRUE=-1,
234 LOAD_GLOBAL=1,
235 CONTINUE_LOOP=0,
236 SETUP_LOOP=0,
237 # close enough...
238 SETUP_EXCEPT=6,
239 SETUP_FINALLY=6, # can push 3 values for the new exception
240 # + 3 others for the previous exception state
241 LOAD_FAST=1,
242 STORE_FAST=-1,
243 DELETE_FAST=0,
244 STORE_ANNOTATION=-1,
245 RAISE_VARARGS=lambda oparg, jmp=0: -oparg,
246 CALL_FUNCTION=lambda oparg, jmp=0: -oparg,
247 CALL_FUNCTION_KW=lambda oparg, jmp=0: -oparg - 1,
248 CALL_FUNCTION_EX=lambda oparg, jmp=0: -1 - ((oparg & 0x01) != 0),
249 MAKE_FUNCTION=lambda oparg, jmp=0: -1
250 - ((oparg & 0x01) != 0)
251 - ((oparg & 0x02) != 0)
252 - ((oparg & 0x04) != 0)
253 - ((oparg & 0x08) != 0),
254 BUILD_SLICE=lambda oparg, jmp=0: -2 if oparg == 3 else -1,
255 LOAD_CLOSURE=1,
256 LOAD_DEREF=1,
257 LOAD_CLASSDEREF=1,
258 STORE_DEREF=-1,
259 DELETE_DEREF=0,
260 GET_AWAITABLE=0,
261 SETUP_ASYNC_WITH=6,
262 BEFORE_ASYNC_WITH=1,
263 GET_AITER=0,
264 GET_ANEXT=1,
265 GET_YIELD_FROM_ITER=0,
266 # If there's a fmt_spec on the stack, we go from 2->1,
267 # else 1->1.
268 FORMAT_VALUE=lambda oparg, jmp=0: -1 if (oparg & FVS_MASK) == FVS_HAVE_SPEC else 0,
269 SET_LINENO=0,
270 EXTENDED_ARG=0,
271)