blob: 23d45aea45035ce36380d77f3792d5f4d09c880b [file] [log] [blame]
#include "P3Interpretor.h"
#include "P3Object.h"
#include "opcode.h"
using namespace p3;
#define fetch_arg() (pc+=2, bc->content[pc-1]<<8+bc->content[pc-2])
#define push(val) stack->content[stack->length++]=val
#define pop() stack->content[--stack->length]
P3Object* P3Interpretor::execute() {
printf("Execute: ");
code->print();
printf("\n");
P3Stack* stack = new P3Stack(code->py_nstacks);
P3String* bc = code->py_code;
uint32 pc=0;
while(1) {
uint8 op = bc->content[pc++];
printf(" -- stack: ");
stack->print();
printf("\n");
printf(" -- fetch opcode %d (%s)\n", op, opcodeNames[op]);
switch(op) {
case STOP_CODE: //0
case POP_TOP: //1
case ROT_TWO: //2
case ROT_THREE: //3
case DUP_TOP: //4
case ROT_FOUR: //5
case NOP: //9
case UNARY_POSITIVE: //10
case UNARY_NEGATIVE: //11
case UNARY_NOT: //12
case UNARY_CONVERT: //13
case UNARY_INVERT: //15
case LIST_APPEND: //18
case BINARY_POWER: //19
case BINARY_MULTIPLY: //20
case BINARY_DIVIDE: //21
case BINARY_MODULO: //22
case BINARY_ADD: //23
case BINARY_SUBTRACT: //24
case BINARY_SUBSCR: //25
case BINARY_FLOOR_DIVIDE: //26
case BINARY_TRUE_DIVIDE: //27
case INPLACE_FLOOR_DIVIDE: //28
case INPLACE_TRUE_DIVIDE: //29
case SLICE: //30
/* Also uses : 31-33 */
case STORE_SLICE: //40
/* Also uses : 41-43 */
case DELETE_SLICE: //50
/* Also uses : 51-53 */
case STORE_MAP: //54
case INPLACE_ADD: //55
case INPLACE_SUBTRACT: //56
case INPLACE_MULTIPLY: //57
case INPLACE_DIVIDE: //58
case INPLACE_MODULO: //59
case STORE_SUBSCR: //60
case DELETE_SUBSCR: //61
case BINARY_LSHIFT: //62
case BINARY_RSHIFT: //63
case BINARY_AND: //64
case BINARY_XOR: //65
case BINARY_OR: //66
case INPLACE_POWER: //67
case GET_ITER: //68
case PRINT_EXPR: //70
NI();
case PRINT_ITEM: //71
pop()->print();
break;
case PRINT_NEWLINE: //72
printf("\n");
break;
case PRINT_ITEM_TO: //73
case PRINT_NEWLINE_TO: //74
case INPLACE_LSHIFT: //75
case INPLACE_RSHIFT: //76
case INPLACE_AND: //77
case INPLACE_XOR: //78
case INPLACE_OR: //79
case BREAK_LOOP: //80
case WITH_CLEANUP: //81
case LOAD_LOCALS: //82
NI();
case RETURN_VALUE: //83
return pop();
case IMPORT_STAR: //84
case EXEC_STMT: //85
case YIELD_VALUE: //86
case POP_BLOCK: //87
case END_FINALLY: //88
case BUILD_CLASS: //89
case HAVE_ARGUMENT: //90
/* Opcodes from here have an argument: */
// case STORE_NAME: //90
/* Index in name list */
case DELETE_NAME: //91
/* "" */
case UNPACK_SEQUENCE: //92
/* Number of sequence items */
case FOR_ITER: //93
case STORE_ATTR: //95
/* Index in name list */
case DELETE_ATTR: //96
/* "" */
case STORE_GLOBAL: //97
/* "" */
case DELETE_GLOBAL: //98
/* "" */
case DUP_TOPX: //99
/* number of items to duplicate */
NI();
case LOAD_CONST: // 100
push(code->py_const->at(fetch_arg()));
break;
/* Index in const list */
case LOAD_NAME: //101
/* Index in name list */
case BUILD_TUPLE: //102
/* Number of tuple items */
case BUILD_LIST: //103
/* Number of list items */
case BUILD_MAP: //104
/* Always zero for now */
case LOAD_ATTR: //105
/* Index in name list */
case COMPARE_OP: //106
/* Comparison operator */
case IMPORT_NAME: //107
/* Index in name list */
case IMPORT_FROM: //108
/* Index in name list */
case JUMP_FORWARD: //110
/* Number of bytes to skip */
case JUMP_IF_FALSE: //111
/* "" */
case JUMP_IF_TRUE: //112
/* "" */
case JUMP_ABSOLUTE: //113
/* Target byte offset from beginning of code */
case LOAD_GLOBAL: //116
/* Index in name list */
case CONTINUE_LOOP: //119
/* Start of loop (absolute) */
case SETUP_LOOP: //120
/* Target address (relative) */
case SETUP_EXCEPT: //121
/* "" */
case SETUP_FINALLY: //122
/* "" */
case LOAD_FAST: //124
/* Local variable number */
case STORE_FAST: //125
/* Local variable number */
case DELETE_FAST: //126
/* Local variable number */
case RAISE_VARARGS: //130
/* Number of raise arguments (1, 2 or 3) */
/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
case CALL_FUNCTION: //131
/* #args + (#kwargs<<8) */
case MAKE_FUNCTION: //132
/* #defaults */
case BUILD_SLICE: //133
/* Number of items */
case MAKE_CLOSURE: //134
/* #free vars */
case LOAD_CLOSURE: //135
/* Load free variable from closure */
case LOAD_DEREF: //136
/* Load and dereference from closure cell */
case STORE_DEREF: //137
/* Store into cell */
/* The next 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
case CALL_FUNCTION_VAR: //140
/* #args + (#kwargs<<8) */
case CALL_FUNCTION_KW: //141
/* #args + (#kwargs<<8) */
case CALL_FUNCTION_VAR_KW: //142
/* #args + (#kwargs<<8) */
/* Support for opargs more than : //16 bits long */
case EXTENDED_ARG: //143
default:
fatal("unable to interpret opcode: %d", op);
}
}
}
const char* P3Interpretor::opcodeNames[] = {
"STOP_CODE", // 0
"POP_TOP", // 1
"ROT_TWO", // 2
"ROT_THREE", // 3
"DUP_TOP", // 4
"ROT_FOUR", // 5
"6__unknow", // 6
"7__unknow", // 7
"8__unknow", // 8
"NOP", // 9
"UNARY_POSITIVE", // 10
"UNARY_NEGATIVE", // 11
"UNARY_NOT", // 12
"UNARY_CONVERT", // 13
"14__unknow", // 14
"UNARY_INVERT", // 15
"16__unknow", // 16
"17__unknow", // 17
"LIST_APPEND", // 18
"BINARY_POWER", // 19
"BINARY_MULTIPLY", // 20
"BINARY_DIVIDE", // 21
"BINARY_MODULO", // 22
"BINARY_ADD", // 23
"BINARY_SUBTRACT", // 24
"BINARY_SUBSCR", // 25
"BINARY_FLOOR_DIVIDE", // 26
"BINARY_TRUE_DIVIDE", // 27
"INPLACE_FLOOR_DIVIDE", // 28
"INPLACE_TRUE_DIVIDE", // 29
"SLICE", // 30
/* Also uses , // 31-, // 33 */
"31__SLICE", // 31
"32__SLICE", // 32
"33__SLICE", // 33
"34__unknow", // 34
"35__unknow", // 35
"36__unknow", // 36
"37__unknow", // 37
"38__unknow", // 38
"39__unknow", // 39
"STORE_SLICE", // 40
/* Also uses , // 41-, // 43 */
"41__STORE_SLICE", // 41
"42__STORE_SLICE", // 42
"43__STORE_SLICE", // 43
"44__unknow", // 44
"45__unknow", // 45
"46__unknow", // 46
"47__unknow", // 47
"48__unknow", // 48
"49__unknow", // 49
"DELETE_SLICE", // 50
/* Also uses , // 51-, // 53 */
"51__DELETE_SLICE", // 51
"52__DELETE_SLICE", // 52
"53__DELETE_SLICE", // 53
"STORE_MAP", // 54
"INPLACE_ADD", // 55
"INPLACE_SUBTRACT", // 56
"INPLACE_MULTIPLY", // 57
"INPLACE_DIVIDE", // 58
"INPLACE_MODULO", // 59
"STORE_SUBSCR", // 60
"DELETE_SUBSCR", // 61
"BINARY_LSHIFT", // 62
"BINARY_RSHIFT", // 63
"BINARY_AND", // 64
"BINARY_XOR", // 65
"BINARY_OR", // 66
"INPLACE_POWER", // 67
"GET_ITER", // 68
"69__unknow", // 69
"PRINT_EXPR", // 70
"PRINT_ITEM", // 71
"PRINT_NEWLINE", // 72
"PRINT_ITEM_TO", // 73
"PRINT_NEWLINE_TO", // 74
"INPLACE_LSHIFT", // 75
"INPLACE_RSHIFT", // 76
"INPLACE_AND", // 77
"INPLACE_XOR", // 78
"INPLACE_OR", // 79
"BREAK_LOOP", // 80
"WITH_CLEANUP", // 81
"LOAD_LOCALS", // 82
"RETURN_VALUE", // 83
"IMPORT_STAR", // 84
"EXEC_STMT", // 85
"YIELD_VALUE", // 86
"POP_BLOCK", // 87
"END_FINALLY", // 88
"BUILD_CLASS", // 89
"HAVE_ARGUMENT", // 90 /* Opcodes from here have an argument: */
// "STORE_NAME", // 90 /* Index in name list */
"DELETE_NAME", // 91 /* "", */
"UNPACK_SEQUENCE", // 92 /* Number of sequence items */
"FOR_ITER", // 93
"94__unknow", // 94
"STORE_ATTR", // 95 /* Index in name list */
"DELETE_ATTR", // 96 /* "" */
"STORE_GLOBAL", // 97 /* "" */
"DELETE_GLOBAL", // 98 /* "" */
"DUP_TOPX", // 99 /* number of items to duplicate */
"LOAD_CONST", // 100 /* Index in const list */
"LOAD_NAME", // 101 /* Index in name list */
"BUILD_TUPLE", // 102 /* Number of tuple items */
"BUILD_LIST", // 103 /* Number of list items */
"BUILD_MAP", // 104 /* Always zero for now */
"LOAD_ATTR", // 105 /* Index in name list */
"COMPARE_OP", // 106 /* Comparison operator */
"IMPORT_NAME", // 107 /* Index in name list */
"IMPORT_FROM", // 108 /* Index in name list */
"109__unknow", // 109
"JUMP_FORWARD", // 110 /* Number of bytes to skip */
"JUMP_IF_FALSE", // 111 /* "" */
"JUMP_IF_TRUE", // 112 /* "" */
"JUMP_ABSOLUTE", // 113 /* Target byte offset from beginning of code */
"114__unknow", // 114
"115__unknow", // 115
"LOAD_GLOBAL", // 116 /* Index in name list */
"117__unknow", // 117
"118__unknow", // 118
"CONTINUE_LOOP", // 119 /* Start of loop (absolute) */
"SETUP_LOOP", // 120 /* Target address (relative) */
"SETUP_EXCEPT", // 121 /* "" */
"SETUP_FINALLY", // 122 /* "" */
"123__unknow", // 123
"LOAD_FAST", // 124 /* Local variable number */
"STORE_FAST", // 125 /* Local variable number */
"DELETE_FAST", // 126 /* Local variable number */
"127__unknow", // 127
"128__unknow", // 128
"129__unknow", // 129
"RAISE_VARARGS", // 130 /* Number of raise arguments (, // 1, , // 2 or , // 3) */
/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
"CALL_FUNCTION", // 131 /* #args + (#kwargs<<, // 8) */
"MAKE_FUNCTION", // 132 /* #defaults */
"BUILD_SLICE", // 133 /* Number of items */
"MAKE_CLOSURE", // 134 /* #free vars */
"LOAD_CLOSURE", // 135 /* Load free variable from closure */
"LOAD_DEREF", // 136 /* Load and dereference from closure cell */
"STORE_DEREF", // 137 /* Store into cell */
"138__unknow", // 138
"139__unknow", // 139
/* The next , // 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & == 1 */
"CALL_FUNCTION_VAR", // 140 /* #args + (#kwargs<<8) */
"CALL_FUNCTION_KW", // 141 /* #args + (#kwargs<<, // 8) */
"CALL_FUNCTION_VAR_KW", // 142 /* #args + (#kwargs<<, // 8) */
/* Support for opargs more than 16 bits long */
"EXTENDED_ARG", // 143
};