#include "code.h" #include "module.h" // Opcodes >= this value have an argument after the opcode #define HAVE_ARG 90 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, 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, }; extern const char* OpcodeNames[256]; bool IsConstArg(int opcode); bool IsNameArg(int opcode); bool IsVarNameArg(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, }; extern const char* OpcodeNames[256]; bool IsConstArg(int opcode); bool IsNameArg(int opcode); bool IsVarNameArg(int opcode); bool IsCellArg(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]; bool IsConstArg(int opcode); bool IsNameArg(int opcode); bool IsVarNameArg(int opcode); bool IsCellArg(int opcode); } void bc_disasm(PycRef code, PycModule* mod, int indent);