this repo has no description
1# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2from compiler.opcode38 import opcode as opcode38
3from compiler.opcodebase import Opcode
4
5cmp_op = (
6 "<",
7 "<=",
8 "==",
9 "!=",
10 ">",
11 ">=",
12 "in",
13 "not in",
14 "is",
15 "is not",
16 "exception match",
17 "BAD",
18)
19hasconst = []
20hasname = []
21hasjrel = []
22hasjabs = []
23haslocal = []
24hascompare = []
25hasfree = []
26opmap = {}
27opname = ["<%r>" % (op,) for op in range(256)]
28
29
30def def_op(name, op):
31 opname[op] = name
32 opmap[name] = op
33
34
35def name_op(name, op):
36 def_op(name, op)
37 hasname.append(op)
38
39
40def jrel_op(name, op):
41 def_op(name, op)
42 hasjrel.append(op)
43
44
45def jabs_op(name, op):
46 def_op(name, op)
47 hasjabs.append(op)
48
49
50def compare_op(name, op):
51 def_op(name, op)
52 hascompare.append(op)
53
54
55def local_op(name, op):
56 def_op(name, op)
57 haslocal.append(op)
58
59
60def free_op(name, op):
61 def_op(name, op)
62 hasfree.append(op)
63
64
65def const_op(name, op):
66 def_op(name, op)
67 hasconst.append(op)
68
69
70def_op("POP_TOP", 1)
71def_op("ROT_TWO", 2)
72def_op("ROT_THREE", 3)
73def_op("DUP_TOP", 4)
74def_op("DUP_TOP_TWO", 5)
75def_op("ROT_FOUR", 6)
76def_op("NOP", 9)
77def_op("UNARY_POSITIVE", 10)
78def_op("UNARY_NEGATIVE", 11)
79def_op("UNARY_NOT", 12)
80def_op("UNARY_INVERT", 15)
81def_op("BINARY_MATRIX_MULTIPLY", 16)
82def_op("INPLACE_MATRIX_MULTIPLY", 17)
83def_op("BINARY_POWER", 19)
84def_op("BINARY_MULTIPLY", 20)
85def_op("BINARY_MODULO", 22)
86def_op("BINARY_ADD", 23)
87def_op("BINARY_SUBTRACT", 24)
88def_op("BINARY_SUBSCR", 25)
89def_op("BINARY_FLOOR_DIVIDE", 26)
90def_op("BINARY_TRUE_DIVIDE", 27)
91def_op("INPLACE_FLOOR_DIVIDE", 28)
92def_op("INPLACE_TRUE_DIVIDE", 29)
93const_op("LOAD_BOOL", 48)
94def_op("GET_AITER", 50)
95def_op("GET_ANEXT", 51)
96def_op("BEFORE_ASYNC_WITH", 52)
97def_op("BEGIN_FINALLY", 53)
98def_op("END_ASYNC_FOR", 54)
99def_op("INPLACE_ADD", 55)
100def_op("INPLACE_SUBTRACT", 56)
101def_op("INPLACE_MULTIPLY", 57)
102def_op("INPLACE_MODULO", 59)
103def_op("STORE_SUBSCR", 60)
104def_op("DELETE_SUBSCR", 61)
105def_op("BINARY_LSHIFT", 62)
106def_op("BINARY_RSHIFT", 63)
107def_op("BINARY_AND", 64)
108def_op("BINARY_XOR", 65)
109def_op("BINARY_OR", 66)
110def_op("INPLACE_POWER", 67)
111def_op("GET_ITER", 68)
112def_op("GET_YIELD_FROM_ITER", 69)
113def_op("PRINT_EXPR", 70)
114def_op("LOAD_BUILD_CLASS", 71)
115def_op("YIELD_FROM", 72)
116def_op("GET_AWAITABLE", 73)
117def_op("INPLACE_LSHIFT", 75)
118def_op("INPLACE_RSHIFT", 76)
119def_op("INPLACE_AND", 77)
120def_op("INPLACE_XOR", 78)
121def_op("INPLACE_OR", 79)
122def_op("WITH_CLEANUP_START", 81)
123def_op("WITH_CLEANUP_FINISH", 82)
124def_op("RETURN_VALUE", 83)
125def_op("IMPORT_STAR", 84)
126def_op("SETUP_ANNOTATIONS", 85)
127def_op("YIELD_VALUE", 86)
128def_op("POP_BLOCK", 87)
129def_op("END_FINALLY", 88)
130def_op("POP_EXCEPT", 89)
131HAVE_ARGUMENT = 90 # Opcodes from here have an argument:
132name_op("STORE_NAME", 90)
133name_op("DELETE_NAME", 91)
134def_op("UNPACK_SEQUENCE", 92)
135jrel_op("FOR_ITER", 93)
136def_op("UNPACK_EX", 94)
137name_op("STORE_ATTR", 95)
138name_op("DELETE_ATTR", 96)
139name_op("STORE_GLOBAL", 97)
140name_op("DELETE_GLOBAL", 98)
141# TODO(emacs): Add reverse_local_op
142def_op("LOAD_FAST_REVERSE_UNCHECKED", 99)
143const_op("LOAD_CONST", 100)
144name_op("LOAD_NAME", 101)
145def_op("BUILD_TUPLE", 102)
146def_op("BUILD_LIST", 103)
147def_op("BUILD_SET", 104)
148def_op("BUILD_MAP", 105)
149name_op("LOAD_ATTR", 106)
150compare_op("COMPARE_OP", 107)
151name_op("IMPORT_NAME", 108)
152name_op("IMPORT_FROM", 109)
153jrel_op("JUMP_FORWARD", 110)
154jabs_op("JUMP_IF_FALSE_OR_POP", 111)
155jabs_op("JUMP_IF_TRUE_OR_POP", 112)
156jabs_op("JUMP_ABSOLUTE", 113)
157jabs_op("POP_JUMP_IF_FALSE", 114)
158jabs_op("POP_JUMP_IF_TRUE", 115)
159name_op("LOAD_GLOBAL", 116)
160jrel_op("SETUP_FINALLY", 122)
161local_op("LOAD_FAST", 124)
162local_op("STORE_FAST", 125)
163local_op("DELETE_FAST", 126)
164# TODO(emacs): Add reverse_local_op
165def_op("DELETE_FAST_REVERSE_UNCHECKED", 127)
166def_op("RAISE_VARARGS", 130)
167def_op("CALL_FUNCTION", 131)
168def_op("MAKE_FUNCTION", 132)
169def_op("BUILD_SLICE", 133)
170free_op("LOAD_CLOSURE", 135)
171free_op("LOAD_DEREF", 136)
172free_op("STORE_DEREF", 137)
173free_op("DELETE_DEREF", 138)
174def_op("CALL_FUNCTION_KW", 141)
175def_op("CALL_FUNCTION_EX", 142)
176jrel_op("SETUP_WITH", 143)
177def_op("EXTENDED_ARG", 144)
178EXTENDED_ARG = 144
179def_op("LIST_APPEND", 145)
180def_op("SET_ADD", 146)
181def_op("MAP_ADD", 147)
182free_op("LOAD_CLASSDEREF", 148)
183def_op("BUILD_LIST_UNPACK", 149)
184def_op("BUILD_MAP_UNPACK", 150)
185def_op("BUILD_MAP_UNPACK_WITH_CALL", 151)
186def_op("BUILD_TUPLE_UNPACK", 152)
187def_op("BUILD_SET_UNPACK", 153)
188jrel_op("SETUP_ASYNC_WITH", 154)
189def_op("FORMAT_VALUE", 155)
190def_op("BUILD_CONST_KEY_MAP", 156)
191def_op("BUILD_STRING", 157)
192def_op("BUILD_TUPLE_UNPACK_WITH_CALL", 158)
193name_op("LOAD_METHOD", 160)
194def_op("CALL_METHOD", 161)
195jrel_op("CALL_FINALLY", 162)
196def_op("POP_FINALLY", 163)
197compare_op("COMPARE_NE_STR", 178)
198jrel_op("FOR_ITER_GENERATOR", 179)
199def_op("STORE_SUBSCR_DICT", 180)
200def_op("BINARY_MUL_SMALLINT", 181)
201def_op("BINARY_SUBSCR_DICT", 182)
202def_op("BINARY_SUBSCR_TUPLE", 183)
203def_op("INPLACE_SUB_SMALLINT", 184)
204def_op("STORE_SUBSCR_LIST", 185)
205def_op("BINARY_SUBSCR_LIST", 186)
206name_op("LOAD_ATTR_INSTANCE_SLOT_DESCR", 187)
207compare_op("COMPARE_IN_LIST", 188)
208compare_op("COMPARE_IN_DICT", 189)
209compare_op("COMPARE_IN_TUPLE", 190)
210compare_op("COMPARE_IN_STR", 191)
211compare_op("COMPARE_IN_POLYMORPHIC", 192)
212compare_op("COMPARE_IN_MONOMORPHIC", 193)
213compare_op("COMPARE_IN_ANAMORPHIC", 194)
214def_op("BINARY_FLOORDIV_SMALLINT", 195)
215def_op("BINARY_AND_SMALLINT", 196)
216jrel_op("FOR_ITER_STR", 197)
217jrel_op("FOR_ITER_RANGE", 198)
218jrel_op("FOR_ITER_TUPLE", 199)
219jrel_op("FOR_ITER_DICT", 200)
220jrel_op("FOR_ITER_LIST", 201)
221def_op("INPLACE_ADD_SMALLINT", 202)
222def_op("COMPARE_EQ_STR", 203)
223compare_op("COMPARE_LE_SMALLINT", 204)
224compare_op("COMPARE_NE_SMALLINT", 205)
225compare_op("COMPARE_GE_SMALLINT", 206)
226compare_op("COMPARE_LT_SMALLINT", 207)
227compare_op("COMPARE_GT_SMALLINT", 208)
228compare_op("COMPARE_EQ_SMALLINT", 209)
229def_op("BINARY_OR_SMALLINT", 210)
230def_op("BINARY_SUB_SMALLINT", 211)
231def_op("BINARY_ADD_SMALLINT", 212)
232def_op("INPLACE_OP_POLYMORPHIC", 213)
233def_op("INPLACE_OP_MONOMORPHIC", 214)
234compare_op("COMPARE_OP_POLYMORPHIC", 215)
235compare_op("COMPARE_OP_MONOMORPHIC", 216)
236def_op("BINARY_OP_POLYMORPHIC", 217)
237def_op("BINARY_OP_MONOMORPHIC", 218)
238def_op("STORE_SUBSCR_POLYMORPHIC", 219)
239def_op("STORE_SUBSCR_MONOMORPHIC", 220)
240jrel_op("FOR_ITER_POLYMORPHIC", 221)
241jrel_op("FOR_ITER_MONOMORPHIC", 222)
242def_op("BINARY_SUBSCR_POLYMORPHIC", 223)
243def_op("BINARY_SUBSCR_MONOMORPHIC", 224)
244name_op("STORE_ATTR_INSTANCE_OVERFLOW_UPDATE", 225)
245name_op("STORE_ATTR_INSTANCE_OVERFLOW", 226)
246name_op("STORE_ATTR_INSTANCE", 227)
247name_op("STORE_ATTR_POLYMORPHIC", 228)
248name_op("LOAD_ATTR_POLYMORPHIC", 229)
249name_op("LOAD_ATTR_INSTANCE_TYPE_BOUND_METHOD", 230)
250name_op("LOAD_ATTR_INSTANCE", 231)
251name_op("LOAD_METHOD_POLYMORPHIC", 232)
252name_op("LOAD_METHOD_INSTANCE_FUNCTION", 233)
253def_op("STORE_SUBSCR_ANAMORPHIC", 234)
254name_op("LOAD_ATTR_INSTANCE_TYPE", 235)
255name_op("LOAD_ATTR_INSTANCE_TYPE_DESCR", 236)
256name_op("LOAD_ATTR_INSTANCE_PROPERTY", 237)
257name_op("STORE_ATTR_INSTANCE_UPDATE", 238)
258name_op("LOAD_ATTR_TYPE", 239)
259name_op("LOAD_ATTR_MODULE", 240)
260def_op("COMPARE_IS_NOT", 241)
261def_op("COMPARE_IS", 242)
262const_op("LOAD_IMMEDIATE", 243)
263# TODO(emacs): Add reverse_local_op
264def_op("STORE_FAST_REVERSE", 244)
265# TODO(emacs): Add reverse_local_op
266def_op("LOAD_FAST_REVERSE", 245)
267name_op("LOAD_METHOD_ANAMORPHIC", 246)
268def_op("STORE_GLOBAL_CACHED", 247)
269name_op("LOAD_GLOBAL_CACHED", 248)
270jrel_op("FOR_ITER_ANAMORPHIC", 249)
271compare_op("COMPARE_OP_ANAMORPHIC", 250)
272def_op("INPLACE_OP_ANAMORPHIC", 251)
273def_op("BINARY_OP_ANAMORPHIC", 252)
274def_op("BINARY_SUBSCR_ANAMORPHIC", 253)
275name_op("STORE_ATTR_ANAMORPHIC", 254)
276name_op("LOAD_ATTR_ANAMORPHIC", 255)
277
278
279# Copy CPython3.8's opcode for the opcodes-as-attributes (needed by the
280# compiler) and the stack effects (also needed by the compiler)
281opcode: Opcode = opcode38.copy()
282opcode.opmap = opmap.copy()
283opcode.opname = opname.copy()
284opcode.hasconst = set(hasconst)
285opcode.hasname = set(hasname)
286opcode.hasjrel = set(hasjrel)
287opcode.hasjabs = set(hasjabs)
288opcode.haslocal = set(haslocal)
289opcode.hascompare = set(hascompare)
290opcode.hasfree = set(hasfree)
291opcode.FVC_MASK = 0x3
292opcode.FVC_NONE = 0x0
293opcode.FVC_STR = 0x1
294opcode.FVC_REPR = 0x2
295opcode.FVC_ASCII = 0x3
296opcode.FVS_MASK = 0x4
297opcode.FVS_HAVE_SPEC = 0x4
298
299
300def add_synonym(old, new):
301 opcode.stack_effects[new] = opcode.stack_effects[old]
302 setattr(opcode, new, opcode.opmap[new])
303
304
305add_synonym("BINARY_ADD", "BINARY_OP_ANAMORPHIC")
306add_synonym("BINARY_SUBSCR", "BINARY_SUBSCR_ANAMORPHIC")
307add_synonym("COMPARE_OP", "COMPARE_IN_ANAMORPHIC")
308add_synonym("COMPARE_OP", "COMPARE_IS")
309add_synonym("COMPARE_OP", "COMPARE_IS_NOT")
310add_synonym("COMPARE_OP", "COMPARE_OP_ANAMORPHIC")
311add_synonym("FOR_ITER", "FOR_ITER_ANAMORPHIC")
312add_synonym("INPLACE_ADD", "INPLACE_OP_ANAMORPHIC")
313add_synonym("LOAD_ATTR", "LOAD_ATTR_ANAMORPHIC")
314add_synonym("LOAD_CONST", "LOAD_BOOL")
315add_synonym("LOAD_METHOD", "LOAD_METHOD_ANAMORPHIC")
316add_synonym("STORE_ATTR", "STORE_ATTR_ANAMORPHIC")
317add_synonym("STORE_SUBSCR", "STORE_SUBSCR_ANAMORPHIC")
318add_synonym("LOAD_FAST", "LOAD_FAST_REVERSE")
319add_synonym("LOAD_FAST", "LOAD_FAST_REVERSE_UNCHECKED")
320add_synonym("STORE_FAST", "STORE_FAST_REVERSE")
321add_synonym("DELETE_FAST", "DELETE_FAST_REVERSE_UNCHECKED")