this repo has no description
at trunk 321 lines 9.3 kB view raw
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")