mirror of
https://github.com/python/cpython.git
synced 2025-01-08 01:24:51 +08:00
f9b760f48a
Issue #27213: Rework CALL_FUNCTION* opcodes to produce shorter and more efficient bytecode: * CALL_FUNCTION now only accepts position arguments * CALL_FUNCTION_KW accepts position arguments and keyword arguments, but keys of keyword arguments are packed into a constant tuple. * CALL_FUNCTION_EX is the most generic, it expects a tuple and a dict for positional and keyword arguments. CALL_FUNCTION_VAR and CALL_FUNCTION_VAR_KW opcodes have been removed. 2 tests of test_traceback are currently broken: skip test, the issue #28050 was created to track the issue. Patch by Demur Rumed, design by Serhiy Storchaka, reviewed by Serhiy Storchaka and Victor Stinner.
215 lines
5.7 KiB
Python
215 lines
5.7 KiB
Python
|
|
"""
|
|
opcode module - potentially shared between dis and other modules which
|
|
operate on bytecodes (e.g. peephole optimizers).
|
|
"""
|
|
|
|
__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs",
|
|
"haslocal", "hascompare", "hasfree", "opname", "opmap",
|
|
"HAVE_ARGUMENT", "EXTENDED_ARG", "hasnargs"]
|
|
|
|
# It's a chicken-and-egg I'm afraid:
|
|
# We're imported before _opcode's made.
|
|
# With exception unheeded
|
|
# (stack_effect is not needed)
|
|
# Both our chickens and eggs are allayed.
|
|
# --Larry Hastings, 2013/11/23
|
|
|
|
try:
|
|
from _opcode import stack_effect
|
|
__all__.append('stack_effect')
|
|
except ImportError:
|
|
pass
|
|
|
|
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is',
|
|
'is not', 'exception match', 'BAD')
|
|
|
|
hasconst = []
|
|
hasname = []
|
|
hasjrel = []
|
|
hasjabs = []
|
|
haslocal = []
|
|
hascompare = []
|
|
hasfree = []
|
|
hasnargs = [] # unused
|
|
|
|
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)
|
|
|
|
# Instruction opcodes for compiled code
|
|
# Blank lines correspond to available opcodes
|
|
|
|
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('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)
|
|
|
|
def_op('GET_AITER', 50)
|
|
def_op('GET_ANEXT', 51)
|
|
def_op('BEFORE_ASYNC_WITH', 52)
|
|
|
|
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('BREAK_LOOP', 80)
|
|
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) # Index in name list
|
|
name_op('DELETE_NAME', 91) # ""
|
|
def_op('UNPACK_SEQUENCE', 92) # Number of tuple items
|
|
jrel_op('FOR_ITER', 93)
|
|
def_op('UNPACK_EX', 94)
|
|
name_op('STORE_ATTR', 95) # Index in name list
|
|
name_op('DELETE_ATTR', 96) # ""
|
|
name_op('STORE_GLOBAL', 97) # ""
|
|
name_op('DELETE_GLOBAL', 98) # ""
|
|
def_op('LOAD_CONST', 100) # Index in const list
|
|
hasconst.append(100)
|
|
name_op('LOAD_NAME', 101) # Index in name list
|
|
def_op('BUILD_TUPLE', 102) # Number of tuple items
|
|
def_op('BUILD_LIST', 103) # Number of list items
|
|
def_op('BUILD_SET', 104) # Number of set items
|
|
def_op('BUILD_MAP', 105) # Number of dict entries (upto 255)
|
|
name_op('LOAD_ATTR', 106) # Index in name list
|
|
def_op('COMPARE_OP', 107) # Comparison operator
|
|
hascompare.append(107)
|
|
name_op('IMPORT_NAME', 108) # Index in name list
|
|
name_op('IMPORT_FROM', 109) # Index in name list
|
|
|
|
jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip
|
|
jabs_op('JUMP_IF_FALSE_OR_POP', 111) # Target byte offset from beginning of code
|
|
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) # Index in name list
|
|
|
|
jabs_op('CONTINUE_LOOP', 119) # Target address
|
|
jrel_op('SETUP_LOOP', 120) # Distance to target address
|
|
jrel_op('SETUP_EXCEPT', 121) # ""
|
|
jrel_op('SETUP_FINALLY', 122) # ""
|
|
|
|
def_op('LOAD_FAST', 124) # Local variable number
|
|
haslocal.append(124)
|
|
def_op('STORE_FAST', 125) # Local variable number
|
|
haslocal.append(125)
|
|
def_op('DELETE_FAST', 126) # Local variable number
|
|
haslocal.append(126)
|
|
name_op('STORE_ANNOTATION', 127) # Index in name list
|
|
|
|
def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3)
|
|
def_op('CALL_FUNCTION', 131) # #args
|
|
def_op('MAKE_FUNCTION', 132) # Flags
|
|
def_op('BUILD_SLICE', 133) # Number of items
|
|
def_op('LOAD_CLOSURE', 135)
|
|
hasfree.append(135)
|
|
def_op('LOAD_DEREF', 136)
|
|
hasfree.append(136)
|
|
def_op('STORE_DEREF', 137)
|
|
hasfree.append(137)
|
|
def_op('DELETE_DEREF', 138)
|
|
hasfree.append(138)
|
|
|
|
def_op('CALL_FUNCTION_KW', 141) # #args + #kwargs
|
|
def_op('CALL_FUNCTION_EX', 142) # Flags
|
|
|
|
jrel_op('SETUP_WITH', 143)
|
|
|
|
def_op('LIST_APPEND', 145)
|
|
def_op('SET_ADD', 146)
|
|
def_op('MAP_ADD', 147)
|
|
|
|
def_op('LOAD_CLASSDEREF', 148)
|
|
hasfree.append(148)
|
|
|
|
jrel_op('SETUP_ASYNC_WITH', 154)
|
|
|
|
def_op('EXTENDED_ARG', 144)
|
|
EXTENDED_ARG = 144
|
|
|
|
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)
|
|
|
|
def_op('FORMAT_VALUE', 155)
|
|
def_op('BUILD_CONST_KEY_MAP', 156)
|
|
def_op('BUILD_STRING', 157)
|
|
|
|
del def_op, name_op, jrel_op, jabs_op
|