library/_compiler_opcode.py (285 lines of code) (raw):
# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
from compiler.opcode38 import opcode as opcode38
from compiler.opcodebase import Opcode
cmp_op = (
"<",
"<=",
"==",
"!=",
">",
">=",
"in",
"not in",
"is",
"is not",
"exception match",
"BAD",
)
hasconst = []
hasname = []
hasjrel = []
hasjabs = []
haslocal = []
hascompare = []
hasfree = []
opmap = {}
opname = ["<%r>" % (op,) for op in range(256)]
def def_op(name, op):
opname[op] = name
opmap[name] = op
def name_op(name, op):
def_op(name, op)
hasname.append(op)
def jrel_op(name, op):
def_op(name, op)
hasjrel.append(op)
def jabs_op(name, op):
def_op(name, op)
hasjabs.append(op)
def compare_op(name, op):
def_op(name, op)
hascompare.append(op)
def local_op(name, op):
def_op(name, op)
haslocal.append(op)
def free_op(name, op):
def_op(name, op)
hasfree.append(op)
def const_op(name, op):
def_op(name, op)
hasconst.append(op)
def_op("POP_TOP", 1)
def_op("ROT_TWO", 2)
def_op("ROT_THREE", 3)
def_op("DUP_TOP", 4)
def_op("DUP_TOP_TWO", 5)
def_op("ROT_FOUR", 6)
def_op("NOP", 9)
def_op("UNARY_POSITIVE", 10)
def_op("UNARY_NEGATIVE", 11)
def_op("UNARY_NOT", 12)
def_op("UNARY_INVERT", 15)
def_op("BINARY_MATRIX_MULTIPLY", 16)
def_op("INPLACE_MATRIX_MULTIPLY", 17)
def_op("BINARY_POWER", 19)
def_op("BINARY_MULTIPLY", 20)
def_op("BINARY_MODULO", 22)
def_op("BINARY_ADD", 23)
def_op("BINARY_SUBTRACT", 24)
def_op("BINARY_SUBSCR", 25)
def_op("BINARY_FLOOR_DIVIDE", 26)
def_op("BINARY_TRUE_DIVIDE", 27)
def_op("INPLACE_FLOOR_DIVIDE", 28)
def_op("INPLACE_TRUE_DIVIDE", 29)
const_op("LOAD_BOOL", 48)
local_op("LOAD_FAST_REVERSE_UNCHECKED", 49)
def_op("GET_AITER", 50)
def_op("GET_ANEXT", 51)
def_op("BEFORE_ASYNC_WITH", 52)
def_op("BEGIN_FINALLY", 53)
def_op("END_ASYNC_FOR", 54)
def_op("INPLACE_ADD", 55)
def_op("INPLACE_SUBTRACT", 56)
def_op("INPLACE_MULTIPLY", 57)
def_op("INPLACE_MODULO", 59)
def_op("STORE_SUBSCR", 60)
def_op("DELETE_SUBSCR", 61)
def_op("BINARY_LSHIFT", 62)
def_op("BINARY_RSHIFT", 63)
def_op("BINARY_AND", 64)
def_op("BINARY_XOR", 65)
def_op("BINARY_OR", 66)
def_op("INPLACE_POWER", 67)
def_op("GET_ITER", 68)
def_op("GET_YIELD_FROM_ITER", 69)
def_op("PRINT_EXPR", 70)
def_op("LOAD_BUILD_CLASS", 71)
def_op("YIELD_FROM", 72)
def_op("GET_AWAITABLE", 73)
def_op("INPLACE_LSHIFT", 75)
def_op("INPLACE_RSHIFT", 76)
def_op("INPLACE_AND", 77)
def_op("INPLACE_XOR", 78)
def_op("INPLACE_OR", 79)
def_op("WITH_CLEANUP_START", 81)
def_op("WITH_CLEANUP_FINISH", 82)
def_op("RETURN_VALUE", 83)
def_op("IMPORT_STAR", 84)
def_op("SETUP_ANNOTATIONS", 85)
def_op("YIELD_VALUE", 86)
def_op("POP_BLOCK", 87)
def_op("END_FINALLY", 88)
def_op("POP_EXCEPT", 89)
HAVE_ARGUMENT = 90 # Opcodes from here have an argument:
name_op("STORE_NAME", 90)
name_op("DELETE_NAME", 91)
def_op("UNPACK_SEQUENCE", 92)
jrel_op("FOR_ITER", 93)
def_op("UNPACK_EX", 94)
name_op("STORE_ATTR", 95)
name_op("DELETE_ATTR", 96)
name_op("STORE_GLOBAL", 97)
name_op("DELETE_GLOBAL", 98)
const_op("LOAD_CONST", 100)
name_op("LOAD_NAME", 101)
def_op("BUILD_TUPLE", 102)
def_op("BUILD_LIST", 103)
def_op("BUILD_SET", 104)
def_op("BUILD_MAP", 105)
name_op("LOAD_ATTR", 106)
compare_op("COMPARE_OP", 107)
name_op("IMPORT_NAME", 108)
name_op("IMPORT_FROM", 109)
jrel_op("JUMP_FORWARD", 110)
jabs_op("JUMP_IF_FALSE_OR_POP", 111)
jabs_op("JUMP_IF_TRUE_OR_POP", 112)
jabs_op("JUMP_ABSOLUTE", 113)
jabs_op("POP_JUMP_IF_FALSE", 114)
jabs_op("POP_JUMP_IF_TRUE", 115)
name_op("LOAD_GLOBAL", 116)
jrel_op("SETUP_FINALLY", 122)
local_op("LOAD_FAST", 124)
local_op("STORE_FAST", 125)
local_op("DELETE_FAST", 126)
def_op("RAISE_VARARGS", 130)
def_op("CALL_FUNCTION", 131)
def_op("MAKE_FUNCTION", 132)
def_op("BUILD_SLICE", 133)
free_op("LOAD_CLOSURE", 135)
free_op("LOAD_DEREF", 136)
free_op("STORE_DEREF", 137)
free_op("DELETE_DEREF", 138)
def_op("CALL_FUNCTION_KW", 141)
def_op("CALL_FUNCTION_EX", 142)
jrel_op("SETUP_WITH", 143)
def_op("EXTENDED_ARG", 144)
EXTENDED_ARG = 144
def_op("LIST_APPEND", 145)
def_op("SET_ADD", 146)
def_op("MAP_ADD", 147)
free_op("LOAD_CLASSDEREF", 148)
def_op("BUILD_LIST_UNPACK", 149)
def_op("BUILD_MAP_UNPACK", 150)
def_op("BUILD_MAP_UNPACK_WITH_CALL", 151)
def_op("BUILD_TUPLE_UNPACK", 152)
def_op("BUILD_SET_UNPACK", 153)
jrel_op("SETUP_ASYNC_WITH", 154)
def_op("FORMAT_VALUE", 155)
def_op("BUILD_CONST_KEY_MAP", 156)
def_op("BUILD_STRING", 157)
def_op("BUILD_TUPLE_UNPACK_WITH_CALL", 158)
name_op("LOAD_METHOD", 160)
def_op("CALL_METHOD", 161)
jrel_op("CALL_FINALLY", 162)
def_op("POP_FINALLY", 163)
compare_op("COMPARE_NE_STR", 178)
jrel_op("FOR_ITER_GENERATOR", 179)
def_op("STORE_SUBSCR_DICT", 180)
def_op("BINARY_MUL_SMALLINT", 181)
def_op("BINARY_SUBSCR_DICT", 182)
def_op("BINARY_SUBSCR_TUPLE", 183)
def_op("INPLACE_SUB_SMALLINT", 184)
def_op("STORE_SUBSCR_LIST", 185)
def_op("BINARY_SUBSCR_LIST", 186)
name_op("LOAD_ATTR_INSTANCE_SLOT_DESCR", 187)
compare_op("COMPARE_IN_LIST", 188)
compare_op("COMPARE_IN_DICT", 189)
compare_op("COMPARE_IN_TUPLE", 190)
compare_op("COMPARE_IN_STR", 191)
compare_op("COMPARE_IN_POLYMORPHIC", 192)
compare_op("COMPARE_IN_MONOMORPHIC", 193)
compare_op("COMPARE_IN_ANAMORPHIC", 194)
def_op("BINARY_FLOORDIV_SMALLINT", 195)
def_op("BINARY_AND_SMALLINT", 196)
jrel_op("FOR_ITER_STR", 197)
jrel_op("FOR_ITER_RANGE", 198)
jrel_op("FOR_ITER_TUPLE", 199)
jrel_op("FOR_ITER_DICT", 200)
jrel_op("FOR_ITER_LIST", 201)
def_op("INPLACE_ADD_SMALLINT", 202)
def_op("COMPARE_EQ_STR", 203)
compare_op("COMPARE_LE_SMALLINT", 204)
compare_op("COMPARE_NE_SMALLINT", 205)
compare_op("COMPARE_GE_SMALLINT", 206)
compare_op("COMPARE_LT_SMALLINT", 207)
compare_op("COMPARE_GT_SMALLINT", 208)
compare_op("COMPARE_EQ_SMALLINT", 209)
def_op("BINARY_OR_SMALLINT", 210)
def_op("BINARY_SUB_SMALLINT", 211)
def_op("BINARY_ADD_SMALLINT", 212)
def_op("INPLACE_OP_POLYMORPHIC", 213)
def_op("INPLACE_OP_MONOMORPHIC", 214)
compare_op("COMPARE_OP_POLYMORPHIC", 215)
compare_op("COMPARE_OP_MONOMORPHIC", 216)
def_op("BINARY_OP_POLYMORPHIC", 217)
def_op("BINARY_OP_MONOMORPHIC", 218)
def_op("STORE_SUBSCR_POLYMORPHIC", 219)
def_op("STORE_SUBSCR_MONOMORPHIC", 220)
jrel_op("FOR_ITER_POLYMORPHIC", 221)
jrel_op("FOR_ITER_MONOMORPHIC", 222)
def_op("BINARY_SUBSCR_POLYMORPHIC", 223)
def_op("BINARY_SUBSCR_MONOMORPHIC", 224)
name_op("STORE_ATTR_INSTANCE_OVERFLOW_UPDATE", 225)
name_op("STORE_ATTR_INSTANCE_OVERFLOW", 226)
name_op("STORE_ATTR_INSTANCE", 227)
name_op("STORE_ATTR_POLYMORPHIC", 228)
name_op("LOAD_ATTR_POLYMORPHIC", 229)
name_op("LOAD_ATTR_INSTANCE_TYPE_BOUND_METHOD", 230)
name_op("LOAD_ATTR_INSTANCE", 231)
name_op("LOAD_METHOD_POLYMORPHIC", 232)
name_op("LOAD_METHOD_INSTANCE_FUNCTION", 233)
def_op("STORE_SUBSCR_ANAMORPHIC", 234)
name_op("LOAD_ATTR_INSTANCE_TYPE", 235)
name_op("LOAD_ATTR_INSTANCE_TYPE_DESCR", 236)
name_op("LOAD_ATTR_INSTANCE_PROPERTY", 237)
name_op("STORE_ATTR_INSTANCE_UPDATE", 238)
name_op("LOAD_ATTR_TYPE", 239)
name_op("LOAD_ATTR_MODULE", 240)
def_op("COMPARE_IS_NOT", 241)
def_op("COMPARE_IS", 242)
const_op("LOAD_IMMEDIATE", 243)
local_op("STORE_FAST_REVERSE", 244)
local_op("LOAD_FAST_REVERSE", 245)
name_op("LOAD_METHOD_ANAMORPHIC", 246)
def_op("STORE_GLOBAL_CACHED", 247)
name_op("LOAD_GLOBAL_CACHED", 248)
jrel_op("FOR_ITER_ANAMORPHIC", 249)
compare_op("COMPARE_OP_ANAMORPHIC", 250)
def_op("INPLACE_OP_ANAMORPHIC", 251)
def_op("BINARY_OP_ANAMORPHIC", 252)
def_op("BINARY_SUBSCR_ANAMORPHIC", 253)
name_op("STORE_ATTR_ANAMORPHIC", 254)
name_op("LOAD_ATTR_ANAMORPHIC", 255)
# Copy CPython3.8's opcode for the opcodes-as-attributes (needed by the
# compiler) and the stack effects (also needed by the compiler)
opcode: Opcode = opcode38.copy()
opcode.opmap = opmap.copy()
opcode.opname = opname.copy()
opcode.hasconst = set(hasconst)
opcode.hasname = set(hasname)
opcode.hasjrel = set(hasjrel)
opcode.hasjabs = set(hasjabs)
opcode.haslocal = set(haslocal)
opcode.hascompare = set(hascompare)
opcode.hasfree = set(hasfree)
opcode.FVC_MASK = 0x3
opcode.FVC_NONE = 0x0
opcode.FVC_STR = 0x1
opcode.FVC_REPR = 0x2
opcode.FVC_ASCII = 0x3
opcode.FVS_MASK = 0x4
opcode.FVS_HAVE_SPEC = 0x4
def add_synonym(old, new):
opcode.stack_effects[new] = opcode.stack_effects[old]
setattr(opcode, new, opcode.opmap[old])
add_synonym("BINARY_ADD", "BINARY_OP_ANAMORPHIC")
add_synonym("BINARY_SUBSCR", "BINARY_SUBSCR_ANAMORPHIC")
add_synonym("COMPARE_OP", "COMPARE_IN_ANAMORPHIC")
add_synonym("COMPARE_OP", "COMPARE_IS")
add_synonym("COMPARE_OP", "COMPARE_IS_NOT")
add_synonym("COMPARE_OP", "COMPARE_OP_ANAMORPHIC")
add_synonym("FOR_ITER", "FOR_ITER_ANAMORPHIC")
add_synonym("INPLACE_ADD", "INPLACE_OP_ANAMORPHIC")
add_synonym("LOAD_ATTR", "LOAD_ATTR_ANAMORPHIC")
add_synonym("LOAD_CONST", "LOAD_BOOL")
add_synonym("LOAD_FAST", "LOAD_FAST_REVERSE_UNCHECKED")
add_synonym("LOAD_METHOD", "LOAD_METHOD_ANAMORPHIC")
add_synonym("STORE_ATTR", "STORE_ATTR_ANAMORPHIC")
add_synonym("STORE_SUBSCR", "STORE_SUBSCR_ANAMORPHIC")