library/compiler/opcode36.py (262 lines of code) (raw):
# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
from .opcodebase import Opcode
opcode: Opcode = Opcode()
opcode.def_op("POP_TOP", 1)
opcode.def_op("ROT_TWO", 2)
opcode.def_op("ROT_THREE", 3)
opcode.def_op("DUP_TOP", 4)
opcode.def_op("DUP_TOP_TWO", 5)
opcode.def_op("NOP", 9)
opcode.def_op("UNARY_POSITIVE", 10)
opcode.def_op("UNARY_NEGATIVE", 11)
opcode.def_op("UNARY_NOT", 12)
opcode.def_op("UNARY_INVERT", 15)
opcode.def_op("BINARY_MATRIX_MULTIPLY", 16)
opcode.def_op("INPLACE_MATRIX_MULTIPLY", 17)
opcode.def_op("BINARY_POWER", 19)
opcode.def_op("BINARY_MULTIPLY", 20)
opcode.def_op("BINARY_MODULO", 22)
opcode.def_op("BINARY_ADD", 23)
opcode.def_op("BINARY_SUBTRACT", 24)
opcode.def_op("BINARY_SUBSCR", 25)
opcode.def_op("BINARY_FLOOR_DIVIDE", 26)
opcode.def_op("BINARY_TRUE_DIVIDE", 27)
opcode.def_op("INPLACE_FLOOR_DIVIDE", 28)
opcode.def_op("INPLACE_TRUE_DIVIDE", 29)
opcode.def_op("GET_AITER", 50)
opcode.def_op("GET_ANEXT", 51)
opcode.def_op("BEFORE_ASYNC_WITH", 52)
opcode.def_op("INPLACE_ADD", 55)
opcode.def_op("INPLACE_SUBTRACT", 56)
opcode.def_op("INPLACE_MULTIPLY", 57)
opcode.def_op("INPLACE_MODULO", 59)
opcode.def_op("STORE_SUBSCR", 60)
opcode.def_op("DELETE_SUBSCR", 61)
opcode.def_op("BINARY_LSHIFT", 62)
opcode.def_op("BINARY_RSHIFT", 63)
opcode.def_op("BINARY_AND", 64)
opcode.def_op("BINARY_XOR", 65)
opcode.def_op("BINARY_OR", 66)
opcode.def_op("INPLACE_POWER", 67)
opcode.def_op("GET_ITER", 68)
opcode.def_op("GET_YIELD_FROM_ITER", 69)
opcode.def_op("PRINT_EXPR", 70)
opcode.def_op("LOAD_BUILD_CLASS", 71)
opcode.def_op("YIELD_FROM", 72)
opcode.def_op("GET_AWAITABLE", 73)
opcode.def_op("INPLACE_LSHIFT", 75)
opcode.def_op("INPLACE_RSHIFT", 76)
opcode.def_op("INPLACE_AND", 77)
opcode.def_op("INPLACE_XOR", 78)
opcode.def_op("INPLACE_OR", 79)
opcode.def_op("BREAK_LOOP", 80)
opcode.def_op("WITH_CLEANUP_START", 81)
opcode.def_op("WITH_CLEANUP_FINISH", 82)
opcode.def_op("RETURN_VALUE", 83)
opcode.def_op("IMPORT_STAR", 84)
opcode.def_op("SETUP_ANNOTATIONS", 85)
opcode.def_op("YIELD_VALUE", 86)
opcode.def_op("POP_BLOCK", 87)
opcode.def_op("END_FINALLY", 88)
opcode.def_op("POP_EXCEPT", 89)
# Opcodes from here have an argument:
opcode.name_op("STORE_NAME", 90) # Index in name list
opcode.name_op("DELETE_NAME", 91) # ""
opcode.def_op("UNPACK_SEQUENCE", 92) # Number of tuple items
opcode.jrel_op("FOR_ITER", 93)
opcode.def_op("UNPACK_EX", 94)
opcode.name_op("STORE_ATTR", 95) # Index in name list
opcode.name_op("DELETE_ATTR", 96) # ""
opcode.name_op("STORE_GLOBAL", 97) # ""
opcode.name_op("DELETE_GLOBAL", 98) # ""
opcode.def_op("LOAD_CONST", 100) # Index in const list
opcode.hasconst.add(100)
opcode.name_op("LOAD_NAME", 101) # Index in name list
opcode.def_op("BUILD_TUPLE", 102) # Number of tuple items
opcode.def_op("BUILD_LIST", 103) # Number of list items
opcode.def_op("BUILD_SET", 104) # Number of set items
opcode.def_op("BUILD_MAP", 105) # Number of dict entries
opcode.name_op("LOAD_ATTR", 106) # Index in name list
opcode.def_op("COMPARE_OP", 107) # Comparison operator
opcode.hascompare.add(107)
opcode.name_op("IMPORT_NAME", 108) # Index in name list
opcode.name_op("IMPORT_FROM", 109) # Index in name list
opcode.jrel_op("JUMP_FORWARD", 110) # Number of bytes to skip
opcode.jabs_op("JUMP_IF_FALSE_OR_POP", 111) # Target byte offset from beginning of code
opcode.jabs_op("JUMP_IF_TRUE_OR_POP", 112) # ""
opcode.jabs_op("JUMP_ABSOLUTE", 113) # ""
opcode.jabs_op("POP_JUMP_IF_FALSE", 114) # ""
opcode.jabs_op("POP_JUMP_IF_TRUE", 115) # ""
opcode.name_op("LOAD_GLOBAL", 116) # Index in name list
opcode.jabs_op("CONTINUE_LOOP", 119) # Target address
opcode.jrel_op("SETUP_LOOP", 120) # Distance to target address
opcode.jrel_op("SETUP_EXCEPT", 121) # ""
opcode.jrel_op("SETUP_FINALLY", 122) # ""
opcode.def_op("LOAD_FAST", 124) # Local variable number
opcode.haslocal.add(124)
opcode.def_op("STORE_FAST", 125) # Local variable number
opcode.haslocal.add(125)
opcode.def_op("DELETE_FAST", 126) # Local variable number
opcode.haslocal.add(126)
opcode.name_op("STORE_ANNOTATION", 127) # Index in name list
opcode.def_op("RAISE_VARARGS", 130) # Number of raise arguments (1, 2, or 3)
opcode.def_op("CALL_FUNCTION", 131) # #args
opcode.def_op("MAKE_FUNCTION", 132) # Flags
opcode.def_op("BUILD_SLICE", 133) # Number of items
opcode.def_op("LOAD_CLOSURE", 135)
opcode.hasfree.add(135)
opcode.def_op("LOAD_DEREF", 136)
opcode.hasfree.add(136)
opcode.def_op("STORE_DEREF", 137)
opcode.hasfree.add(137)
opcode.def_op("DELETE_DEREF", 138)
opcode.hasfree.add(138)
opcode.def_op("CALL_FUNCTION_KW", 141) # #args + #kwargs
opcode.def_op("CALL_FUNCTION_EX", 142) # Flags
opcode.jrel_op("SETUP_WITH", 143)
opcode.def_op("LIST_APPEND", 145)
opcode.def_op("SET_ADD", 146)
opcode.def_op("MAP_ADD", 147)
opcode.def_op("LOAD_CLASSDEREF", 148)
opcode.hasfree.add(148)
opcode.def_op("EXTENDED_ARG", 144)
opcode.def_op("BUILD_LIST_UNPACK", 149)
opcode.def_op("BUILD_MAP_UNPACK", 150)
opcode.def_op("BUILD_MAP_UNPACK_WITH_CALL", 151)
opcode.def_op("BUILD_TUPLE_UNPACK", 152)
opcode.def_op("BUILD_SET_UNPACK", 153)
opcode.jrel_op("SETUP_ASYNC_WITH", 154)
opcode.def_op("FORMAT_VALUE", 155)
opcode.def_op("BUILD_CONST_KEY_MAP", 156)
opcode.def_op("BUILD_STRING", 157)
opcode.def_op("BUILD_TUPLE_UNPACK_WITH_CALL", 158)
FVC_MASK = 0x3
FVC_NONE = 0x0
FVC_STR = 0x1
FVC_REPR = 0x2
FVC_ASCII = 0x3
FVS_MASK = 0x4
FVS_HAVE_SPEC = 0x4
opcode.stack_effects.update(
NOP=0,
POP_TOP=-1,
ROT_TWO=0,
ROT_THREE=0,
DUP_TOP=1,
DUP_TOP_TWO=2,
UNARY_POSITIVE=0,
UNARY_NEGATIVE=0,
UNARY_NOT=0,
UNARY_INVERT=0,
SET_ADD=-1,
LIST_APPEND=-1,
MAP_ADD=-2,
BINARY_POWER=-1,
BINARY_MULTIPLY=-1,
BINARY_MATRIX_MULTIPLY=-1,
BINARY_MODULO=-1,
BINARY_ADD=-1,
BINARY_SUBTRACT=-1,
BINARY_SUBSCR=-1,
BINARY_FLOOR_DIVIDE=-1,
BINARY_TRUE_DIVIDE=-1,
INPLACE_FLOOR_DIVIDE=-1,
INPLACE_TRUE_DIVIDE=-1,
INPLACE_ADD=-1,
INPLACE_SUBTRACT=-1,
INPLACE_MULTIPLY=-1,
INPLACE_MATRIX_MULTIPLY=-1,
INPLACE_MODULO=-1,
STORE_SUBSCR=-3,
DELETE_SUBSCR=-2,
BINARY_LSHIFT=-1,
BINARY_RSHIFT=-1,
BINARY_AND=-1,
BINARY_XOR=-1,
BINARY_OR=-1,
INPLACE_POWER=-1,
GET_ITER=0,
PRINT_EXPR=-1,
LOAD_BUILD_CLASS=1,
INPLACE_LSHIFT=-1,
INPLACE_RSHIFT=-1,
INPLACE_AND=-1,
INPLACE_XOR=-1,
INPLACE_OR=-1,
BREAK_LOOP=0,
SETUP_WITH=7,
WITH_CLEANUP_START=1,
WITH_CLEANUP_FINISH=-1, # XXX Sometimes more
RETURN_VALUE=-1,
IMPORT_STAR=-1,
SETUP_ANNOTATIONS=0,
YIELD_VALUE=0,
YIELD_FROM=-1,
POP_BLOCK=0,
POP_EXCEPT=0, # -3 except if bad bytecode
END_FINALLY=-1, # or -2 or -3 if exception occurred
STORE_NAME=-1,
DELETE_NAME=0,
UNPACK_SEQUENCE=lambda oparg, jmp=0: oparg - 1,
UNPACK_EX=lambda oparg, jmp=0: (oparg & 0xFF) + (oparg >> 8),
FOR_ITER=1, # or -1, at end of iterator
STORE_ATTR=-2,
DELETE_ATTR=-1,
STORE_GLOBAL=-1,
DELETE_GLOBAL=0,
LOAD_CONST=1,
LOAD_NAME=1,
BUILD_TUPLE=lambda oparg, jmp=0: 1 - oparg,
BUILD_LIST=lambda oparg, jmp=0: 1 - oparg,
BUILD_SET=lambda oparg, jmp=0: 1 - oparg,
BUILD_STRING=lambda oparg, jmp=0: 1 - oparg,
BUILD_LIST_UNPACK=lambda oparg, jmp=0: 1 - oparg,
BUILD_TUPLE_UNPACK=lambda oparg, jmp=0: 1 - oparg,
BUILD_TUPLE_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg,
BUILD_SET_UNPACK=lambda oparg, jmp=0: 1 - oparg,
BUILD_MAP_UNPACK=lambda oparg, jmp=0: 1 - oparg,
BUILD_MAP_UNPACK_WITH_CALL=lambda oparg, jmp=0: 1 - oparg,
BUILD_MAP=lambda oparg, jmp=0: 1 - 2 * oparg,
BUILD_CONST_KEY_MAP=lambda oparg, jmp=0: -oparg,
LOAD_ATTR=0,
COMPARE_OP=-1,
IMPORT_NAME=-1,
IMPORT_FROM=1,
JUMP_FORWARD=0,
JUMP_IF_TRUE_OR_POP=0, # -1 if jump not taken
JUMP_IF_FALSE_OR_POP=0, # ""
JUMP_ABSOLUTE=0,
POP_JUMP_IF_FALSE=-1,
POP_JUMP_IF_TRUE=-1,
LOAD_GLOBAL=1,
CONTINUE_LOOP=0,
SETUP_LOOP=0,
# close enough...
SETUP_EXCEPT=6,
SETUP_FINALLY=6, # can push 3 values for the new exception
# + 3 others for the previous exception state
LOAD_FAST=1,
STORE_FAST=-1,
DELETE_FAST=0,
STORE_ANNOTATION=-1,
RAISE_VARARGS=lambda oparg, jmp=0: -oparg,
CALL_FUNCTION=lambda oparg, jmp=0: -oparg,
CALL_FUNCTION_KW=lambda oparg, jmp=0: -oparg - 1,
CALL_FUNCTION_EX=lambda oparg, jmp=0: -1 - ((oparg & 0x01) != 0),
MAKE_FUNCTION=lambda oparg, jmp=0: -1
- ((oparg & 0x01) != 0)
- ((oparg & 0x02) != 0)
- ((oparg & 0x04) != 0)
- ((oparg & 0x08) != 0),
BUILD_SLICE=lambda oparg, jmp=0: -2 if oparg == 3 else -1,
LOAD_CLOSURE=1,
LOAD_DEREF=1,
LOAD_CLASSDEREF=1,
STORE_DEREF=-1,
DELETE_DEREF=0,
GET_AWAITABLE=0,
SETUP_ASYNC_WITH=6,
BEFORE_ASYNC_WITH=1,
GET_AITER=0,
GET_ANEXT=1,
GET_YIELD_FROM_ITER=0,
# If there's a fmt_spec on the stack, we go from 2->1,
# else 1->1.
FORMAT_VALUE=lambda oparg, jmp=0: -1 if (oparg & FVS_MASK) == FVS_HAVE_SPEC else 0,
SET_LINENO=0,
EXTENDED_ARG=0,
)