Use opcode mappings to keep things a bit cleaner and hopefully more sane
This commit is contained in:
172
bytecode.h
172
bytecode.h
@@ -2,139 +2,53 @@
|
||||
#include "module.h"
|
||||
#include "data.h"
|
||||
|
||||
// Opcodes >= this value have an argument after the opcode
|
||||
#define HAVE_ARG 90
|
||||
namespace Pyc {
|
||||
|
||||
namespace Py1k {
|
||||
|
||||
enum Opcodes {
|
||||
STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP,
|
||||
UNARY_POSITIVE = 10, UNARY_NEGATIVE, UNARY_NOT, UNARY_CONVERT,
|
||||
UNARY_CALL, UNARY_INVERT,
|
||||
BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_DIVIDE, BINARY_MODULO,
|
||||
enum Opcode {
|
||||
/* No parameter word */
|
||||
STOP_CODE, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, UNARY_POSITIVE,
|
||||
UNARY_NEGATIVE, UNARY_NOT, UNARY_CONVERT, UNARY_CALL, UNARY_INVERT,
|
||||
BINARY_POWER, BINARY_MULTIPLY, BINARY_DIVIDE, BINARY_MODULO,
|
||||
BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_CALL,
|
||||
SLICE_0 = 30, SLICE_1, SLICE_2, SLICE_3,
|
||||
STORE_SLICE_0 = 40, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3,
|
||||
DELETE_SLICE_0 = 50, DELETE_SLICE_1, DELETE_SLICE_2, DELETE_SLICE_3,
|
||||
STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT,
|
||||
BINARY_AND, BINARY_XOR, BINARY_OR,
|
||||
PRINT_EXPR = 70, PRINT_ITEM, PRINT_NEWLINE,
|
||||
BREAK_LOOP = 80, RAISE_EXCEPTION, LOAD_LOCALS, RETURN_VALUE,
|
||||
LOAD_GLOBALS, EXEC_STMT, BUILD_FUNCTION, POP_BLOCK, END_FINALLY,
|
||||
BUILD_CLASS,
|
||||
STORE_NAME = 90, DELETE_NAME, UNPACK_TUPLE, UNPACK_LIST, UNPACK_ARG,
|
||||
STORE_ATTR, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL, UNPACK_VARARG,
|
||||
LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_MAP,
|
||||
LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM,
|
||||
JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE,
|
||||
FOR_LOOP, LOAD_LOCAL, LOAD_GLOBAL, SET_FUNC_ARGS,
|
||||
SETUP_LOOP = 120, SETUP_EXCEPT, SETUP_FINALLY, RESERVE_FAST,
|
||||
LOAD_FAST, STORE_FAST, DELETE_FAST, SET_LINENO,
|
||||
RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE,
|
||||
CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW,
|
||||
SLICE_0, SLICE_1, SLICE_2, SLICE_3, STORE_SLICE_0, STORE_SLICE_1,
|
||||
STORE_SLICE_2, STORE_SLICE_3, DELETE_SLICE_0, DELETE_SLICE_1,
|
||||
DELETE_SLICE_2, DELETE_SLICE_3, STORE_SUBSCR, DELETE_SUBSCR,
|
||||
BINARY_LSHIFT, BINARY_RSHIFT, BINARY_AND, BINARY_XOR, BINARY_OR,
|
||||
PRINT_EXPR, PRINT_ITEM, PRINT_NEWLINE, BREAK_LOOP, RAISE_EXCEPTION,
|
||||
LOAD_LOCALS, RETURN_VALUE, LOAD_GLOBALS, EXEC_STMT, BUILD_FUNCTION,
|
||||
POP_BLOCK, END_FINALLY, BUILD_CLASS, ROT_FOUR, NOP, LIST_APPEND,
|
||||
BINARY_FLOOR_DIVIDE, BINARY_TRUE_DIVIDE, INPLACE_FLOOR_DIVIDE,
|
||||
INPLACE_TRUE_DIVIDE, STORE_MAP, INPLACE_ADD, INPLACE_SUBTRACT,
|
||||
INPLACE_MULTIPLY, INPLACE_DIVIDE, INPLACE_MODULO, INPLACE_POWER,
|
||||
GET_ITER, PRINT_ITEM_TO, PRINT_NEWLINE_TO, INPLACE_LSHIFT,
|
||||
INPLACE_RSHIFT, INPLACE_AND, INPLACE_XOR, INPLACE_OR, WITH_CLEANUP,
|
||||
IMPORT_STAR, YIELD_VALUE, LOAD_BUILD_CLASS, STORE_LOCALS,
|
||||
POP_EXCEPT, SET_ADD,
|
||||
|
||||
/* Has parameter word */
|
||||
PYC_HAVE_ARG,
|
||||
STORE_NAME_A = PYC_HAVE_ARG, DELETE_NAME_A, UNPACK_TUPLE_A,
|
||||
UNPACK_LIST_A, UNPACK_ARG_A, STORE_ATTR_A, DELETE_ATTR_A,
|
||||
STORE_GLOBAL_A, DELETE_GLOBAL_A, UNPACK_VARARG_A, LOAD_CONST_A,
|
||||
LOAD_NAME_A, BUILD_TUPLE_A, BUILD_LIST_A, BUILD_MAP_A, LOAD_ATTR_A,
|
||||
COMPARE_OP_A, IMPORT_NAME_A, IMPORT_FROM_A, JUMP_FORWARD_A,
|
||||
JUMP_IF_FALSE_A, JUMP_IF_TRUE_A, JUMP_ABSOLUTE_A, FOR_LOOP_A,
|
||||
LOAD_LOCAL_A, LOAD_GLOBAL_A, SET_FUNC_ARGS_A, SETUP_LOOP_A,
|
||||
SETUP_EXCEPT_A, SETUP_FINALLY_A, RESERVE_FAST_A, LOAD_FAST_A,
|
||||
STORE_FAST_A, DELETE_FAST_A, SET_LINENO_A, RAISE_VARARGS_A,
|
||||
CALL_FUNCTION_A, MAKE_FUNCTION_A, BUILD_SLICE_A, CALL_FUNCTION_VAR_A,
|
||||
CALL_FUNCTION_KW_A, CALL_FUNCTION_VAR_KW_A, UNPACK_SEQUENCE_A, FOR_ITER_A,
|
||||
DUP_TOPX_A, BUILD_SET_A, JUMP_IF_FALSE_OR_POP_A, JUMP_IF_TRUE_OR_POP_A,
|
||||
POP_JUMP_IF_FALSE_A, POP_JUMP_IF_TRUE_A, CONTINUE_LOOP_A, MAKE_CLOSURE_A,
|
||||
LOAD_CLOSURE_A, LOAD_DEREF_A, STORE_DEREF_A, EXTENDED_ARG_A, SETUP_WITH_A,
|
||||
SET_ADD_A, MAP_ADD_A, UNPACK_EX_A, LIST_APPEND_A,
|
||||
|
||||
PYC_LAST_OPCODE,
|
||||
PYC_INVALID_OPCODE = -1,
|
||||
};
|
||||
|
||||
extern const char* OpcodeNames[256];
|
||||
|
||||
bool IsConstArg(int opcode);
|
||||
bool IsNameArg(int opcode);
|
||||
bool IsVarNameArg(int opcode);
|
||||
bool IsJumpOffsetArg(int opcode);
|
||||
|
||||
}
|
||||
|
||||
namespace Py2k {
|
||||
|
||||
enum Opcodes {
|
||||
STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, ROT_FOUR,
|
||||
NOP = 9, UNARY_POSITIVE, UNARY_NEGATIVE, UNARY_NOT, UNARY_CONVERT,
|
||||
UNARY_INVERT = 15, LIST_APPEND = 18,
|
||||
BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_DIVIDE, BINARY_MODULO,
|
||||
BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_FLOOR_DIVIDE,
|
||||
BINARY_TRUE_DIVIDE, INPLACE_FLOOR_DIVIDE, INPLACE_TRUE_DIVIDE,
|
||||
SLICE_0 = 30, SLICE_1, SLICE_2, SLICE_3,
|
||||
STORE_SLICE_0 = 40, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3,
|
||||
DELETE_SLICE_0 = 50, DELETE_SLICE_1, DELETE_SLICE_2, DELETE_SLICE_3,
|
||||
STORE_MAP = 54, INPLACE_ADD, INPLACE_SUBTRACT, INPLACE_MULTIPLY,
|
||||
INPLACE_DIVIDE, INPLACE_MODULO,
|
||||
STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT,
|
||||
BINARY_AND, BINARY_XOR, BINARY_OR, INPLACE_POWER, GET_ITER,
|
||||
PRINT_EXPR = 70, PRINT_ITEM, PRINT_NEWLINE, PRINT_ITEM_TO,
|
||||
PRINT_NEWLINE_TO, INPLACE_LSHIFT, INPLACE_RSHIFT, INPLACE_AND,
|
||||
INPLACE_XOR, INPLACE_OR,
|
||||
BREAK_LOOP = 80, WITH_CLEANUP, LOAD_LOCALS, RETURN_VALUE,
|
||||
IMPORT_STAR, EXEC_STMT, YIELD_VALUE, POP_BLOCK, END_FINALLY,
|
||||
BUILD_CLASS,
|
||||
STORE_NAME = 90, DELETE_NAME, UNPACK_SEQUENCE, FOR_ITER,
|
||||
STORE_ATTR = 95, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL,
|
||||
DUP_TOPX, LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_MAP,
|
||||
LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM,
|
||||
JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE,
|
||||
FOR_LOOP, LOAD_GLOBAL = 116,
|
||||
CONTINUE_LOOP = 119, SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY,
|
||||
LOAD_FAST = 124, STORE_FAST, DELETE_FAST, SET_LINENO,
|
||||
RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE,
|
||||
MAKE_CLOSURE, LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF,
|
||||
CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW,
|
||||
EXTENDED_ARG,
|
||||
|
||||
/* Different opcodes in Python 2.7. Boo! */
|
||||
LIST_APPEND_27 = 94,
|
||||
BUILD_SET_27 = BUILD_MAP, BUILD_MAP_27, LOAD_ATTR_27, COMPARE_OP_27,
|
||||
IMPORT_NAME_27, IMPORT_FROM_27,
|
||||
JUMP_IF_FALSE_OR_POP = JUMP_IF_FALSE,
|
||||
JUMP_IF_TRUE_OR_POP = JUMP_IF_TRUE,
|
||||
POP_JUMP_IF_FALSE = FOR_LOOP, POP_JUMP_IF_TRUE,
|
||||
SETUP_WITH = EXTENDED_ARG, EXTENDED_ARG_27 = 145,
|
||||
SET_ADD = 146, MAP_ADD,
|
||||
};
|
||||
|
||||
extern const char* OpcodeNames[256];
|
||||
extern const char* OpcodeNames27[256];
|
||||
|
||||
bool IsConstArg(int opcode);
|
||||
bool IsNameArg(int opcode, int minorVer);
|
||||
bool IsVarNameArg(int opcode);
|
||||
bool IsCellArg(int opcode);
|
||||
bool IsJumpOffsetArg(int opcode);
|
||||
|
||||
}
|
||||
|
||||
namespace Py3k {
|
||||
|
||||
enum Opcodes {
|
||||
STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, ROT_FOUR,
|
||||
NOP = 9, UNARY_POSITIVE, UNARY_NEGATIVE, UNARY_NOT,
|
||||
UNARY_INVERT = 15, SET_ADD = 17, LIST_APPEND,
|
||||
BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_MODULO = 22,
|
||||
BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_FLOOR_DIVIDE,
|
||||
BINARY_TRUE_DIVIDE, INPLACE_FLOOR_DIVIDE, INPLACE_TRUE_DIVIDE,
|
||||
STORE_MAP = 54, INPLACE_ADD, INPLACE_SUBTRACT, INPLACE_MULTIPLY,
|
||||
INPLACE_MODULO = 59,
|
||||
STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT,
|
||||
BINARY_AND, BINARY_XOR, BINARY_OR, INPLACE_POWER, GET_ITER,
|
||||
STORE_LOCALS,
|
||||
PRINT_EXPR = 70, LOAD_BUILD_CLASS,
|
||||
INPLACE_LSHIFT = 75, INPLACE_RSHIFT, INPLACE_AND, INPLACE_XOR,
|
||||
INPLACE_OR,
|
||||
BREAK_LOOP = 80, WITH_CLEANUP, RETURN_VALUE = 83,
|
||||
IMPORT_STAR, YIELD_VALUE = 86, POP_BLOCK, END_FINALLY, POP_EXCEPT,
|
||||
STORE_NAME = 90, DELETE_NAME, UNPACK_SEQUENCE, FOR_ITER, UNPACK_EX,
|
||||
STORE_ATTR, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL,
|
||||
DUP_TOPX, LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_SET,
|
||||
BUILD_MAP, LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM,
|
||||
JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE,
|
||||
POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE, LOAD_GLOBAL,
|
||||
CONTINUE_LOOP = 119, SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY,
|
||||
LOAD_FAST = 124, STORE_FAST, DELETE_FAST,
|
||||
RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE,
|
||||
MAKE_CLOSURE, LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF,
|
||||
CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW,
|
||||
EXTENDED_ARG,
|
||||
LIST_APPEND_A = 145, SET_ADD_A, MAP_ADD_A,
|
||||
};
|
||||
|
||||
extern const char* OpcodeNames[256];
|
||||
const char* OpcodeName(int opcode);
|
||||
int ByteToOpcode(int maj, int min, int opcode);
|
||||
|
||||
bool IsConstArg(int opcode);
|
||||
bool IsNameArg(int opcode);
|
||||
|
Reference in New Issue
Block a user