executejava_aligned.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 1,990 行 · 第 1/5 页
C
1,990 行
CASE(opc_bipush, 2) STACK_INT(0) = (CVMInt8)(pc[1]); TRACE(("\tbipush %d\n", STACK_INT(0))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1); /* Push a 2-byte signed integer constant onto the stack. */ CASE(opc_sipush, 3) STACK_INT(0) = CVMgetInt16(pc + 1); TRACE(("\tsipush %d\n", STACK_INT(0))); UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1); /* A few of the non-quick opcodes */#ifdef CVM_CLASSLOADING CASE(opc_ldc, 0) clobbersCpIndex = CVM_FALSE; goto quicken_opcode; CASE(opc_ldc_w, 0) clobbersCpIndex = CVM_FALSE; goto quicken_opcode; CASE(opc_ldc2_w, 0) clobbersCpIndex = CVM_FALSE; goto quicken_opcode;#else CASE(opc_ldc, 0) goto unimplemented_opcode; CASE(opc_ldc_w, 0) goto unimplemented_opcode; CASE(opc_ldc2_w, 0) goto unimplemented_opcode;#endif /* load from local variable */ CASE(opc_iload, 2) { CVMUint32 localNo = pc[1]; CVMSlotVal32 l = locals[localNo]; topOfStack += 1; STACK_SLOT(-1) = l; TRACE(("\tiload locals[%d](%d) =>\n", localNo, STACK_INT(-1))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 0); } /* outline to make room for pc-relative table on sarm */ CASE(opc_lload, 2) CVMmemCopy64(&STACK_INFO(0).raw, &locals[pc[1]].j.raw); TRACE(("\tlload locals[%d](%s) =>\n", pc[1], GET_LONGCSTRING(STACK_LONG(0)))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2); CASE(opc_fload, 2) { CVMUint32 localNo = pc[1]; CVMSlotVal32 l = locals[localNo]; topOfStack += 1; STACK_SLOT(-1) = l; TRACE(("\tfload locals[%d](%f) =>\n", localNo, STACK_FLOAT(-1))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 0); } CASE(opc_dload, 2) CVMmemCopy64(&STACK_INFO(0).raw, &locals[pc[1]].j.raw); TRACE(("\tdload locals[%d](%f) =>\n", pc[1], STACK_DOUBLE(0))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2); CASE(opc_aload, 2) { CVMUint32 localNo = pc[1]; CVMSlotVal32 l = locals[localNo]; topOfStack += 1; STACK_SLOT(-1) = l; TRACE(("\taload locals[%d](0x%x) =>\n", localNo, STACK_OBJECT(-1))); UPDATE_PC_AND_TOS_AND_CONTINUE(2, 0); }#undef OPC_ILOAD_n#define OPC_ILOAD_n(num) \ CASE(opc_iload_##num, 1) { \ CVMSlotVal32 l; \ pc += 1; \ l = locals[num]; \ topOfStack += 1; \ STACK_SLOT(-1) = l; \ TRACE(("\t%s locals[%d](%d) =>\n", \ CVMopnames[pc[0]], num, STACK_INT(-1))); \ UPDATE_PC_AND_TOS_AND_CONTINUE(0, 0); \ } OPC_ILOAD_n(0); OPC_ILOAD_n(1); OPC_ILOAD_n(2); OPC_ILOAD_n(3);#undef OPC_LLOAD_n#define OPC_LLOAD_n(num) \ CASE(opc_lload_##num, 1) \ CVMmemCopy64(&STACK_INFO(0).raw, &locals[num].j.raw); \ TRACE(("\t%s locals[%d](%s) =>\n", \ CVMopnames[pc[0]], num, \ GET_LONGCSTRING(STACK_LONG(0)))); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2); OPC_LLOAD_n(0); OPC_LLOAD_n(1); OPC_LLOAD_n(2); OPC_LLOAD_n(3);#undef OPC_FLOAD_n#define OPC_FLOAD_n(num) \ CASE(opc_fload_##num, 1) \ STACK_SLOT(0) = locals[num]; \ TRACE(("\t%s locals[%d](%d) =>\n", \ CVMopnames[pc[0]], num, STACK_FLOAT(0))); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); OPC_FLOAD_n(0); OPC_FLOAD_n(1); OPC_FLOAD_n(2); OPC_FLOAD_n(3);#undef OPC_DLOAD_n#define OPC_DLOAD_n(num) \ CASE(opc_dload_##num, 1) \ CVMmemCopy64(&STACK_INFO(0).raw, &locals[num].j.raw); \ TRACE(("\t%s locals[%d](%f) =>\n", \ CVMopnames[pc[0]], num, STACK_DOUBLE(0))); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2); OPC_DLOAD_n(0); OPC_DLOAD_n(1); OPC_DLOAD_n(2); OPC_DLOAD_n(3);#undef OPC_ALOAD_n#define OPC_ALOAD_n(num) \ CASE(opc_aload_##num, 1) \ STACK_SLOT(0) = locals[num]; \ TRACE(("\t%s locals[%d](0x%x) =>\n", \ CVMopnames[pc[0]], num, STACK_OBJECT(0))); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); OPC_ALOAD_n(0); OPC_ALOAD_n(1); OPC_ALOAD_n(2); OPC_ALOAD_n(3); /* Array load opcodes */ /* Every array load and store opcodes starts out like this */#define ARRAY_INTRO(T, arrayOff) \ CVMArrayOf##T* arrObj = (CVMArrayOf##T*)STACK_OBJECT(arrayOff); \ CVMJavaInt index = STACK_INT(arrayOff + 1); \ CHECK_NULL(arrObj); \ /* This clever idea is from ExactVM. No need to test index >= 0. \ Instead, do an unsigned comparison. Negative indices will appear \ as positive numbers >= 2^31, which is just out of the range \ of legal Java array indices */ \ if ((CVMUint32)index >= CVMD_arrayGetLength(arrObj)) { \ goto array_index_out_of_bounds_exception; \ } /* 32-bit loads. These handle conversion from < 32-bit types */#define ARRAY_LOADTO32(T, format, stackRes) \ { \ ARRAY_INTRO(T, -2); \ CVMD_arrayRead##T(arrObj, index, stackRes(-2)); \ TRACE(("\t%s %O[%d](" format ") ==>\n", CVMopnames[pc[0]], \ arrObj, index, stackRes(-1))); \ UPDATE_PC_AND_TOS_AND_CONTINUE_1_m1; \ } /* 64-bit loads */#define ARRAY_LOADTO64(T,T2) \ { \ CVMJava##T temp64; \ ARRAY_INTRO(T, -2); \ CVMD_arrayRead##T(arrObj, index, temp64); \ CVM##T2##2Jvm(&STACK_INFO(-2).raw, temp64); \ TRACE(("\t%s %O[%d](0x%X, 0x%X) ==>\n", CVMopnames[pc[0]], \ arrObj, index, STACK_INT(-2), STACK_INT(-1))); \ UPDATE_PC_AND_TOS_AND_CONTINUE_1_0; \ } CASE(opc_iaload, 1) ARRAY_LOADTO32(Int, "%d", STACK_INT); CASE(opc_laload, 1) ARRAY_LOADTO64(Long,long); CASE(opc_faload, 1) ARRAY_LOADTO32(Float, "%f", STACK_FLOAT); CASE(opc_daload, 1) goto opc_daload_overflow; CASE(opc_aaload, 1) ARRAY_LOADTO32(Ref, "0x%x", STACK_OBJECT); CASE(opc_baload, 1) ARRAY_LOADTO32(Byte, "%d", STACK_INT); CASE(opc_caload, 1) ARRAY_LOADTO32(Char, "%d", STACK_INT); CASE(opc_saload, 1) ARRAY_LOADTO32(Short, "%d", STACK_INT); /* store to a local variable */ CASE(opc_istore, 2) locals[pc[1]] = STACK_SLOT(-1); TRACE(("\tistore %d ==> locals[%d]\n", STACK_INT(-1), pc[1])); UPDATE_PC_AND_TOS_AND_CONTINUE(2, -1); CASE(opc_lstore, 2) CVMmemCopy64(&locals[pc[1]].j.raw, &STACK_INFO(-2).raw); TRACE(("\tlstore %s => locals[%d]\n", GET_LONGCSTRING(STACK_LONG(-2)), pc[1])); UPDATE_PC_AND_TOS_AND_CONTINUE(2, -2); CASE(opc_fstore, 2) locals[pc[1]] = STACK_SLOT(-1); TRACE(("\tfstore %f ==> locals[%d]\n", STACK_FLOAT(-1), pc[1])); UPDATE_PC_AND_TOS_AND_CONTINUE(2, -1); CASE(opc_dstore, 2) CVMmemCopy64(&locals[pc[1]].j.raw, &STACK_INFO(-2).raw); TRACE(("\tdstore %f => locals[%d]\n", STACK_DOUBLE(-2), pc[1])); UPDATE_PC_AND_TOS_AND_CONTINUE(2, -2); CASE(opc_astore, 2) locals[pc[1]] = STACK_SLOT(-1); TRACE(("\tastore 0x%x => locals[%d]\n", STACK_OBJECT(-1), pc[1])); UPDATE_PC_AND_TOS_AND_CONTINUE(2, -1);#undef OPC_ISTORE_n#define OPC_ISTORE_n(num) \ CASE(opc_istore_##num, 1) \ locals[num] = STACK_SLOT(-1); \ TRACE(("\t%s %d => locals[%d]\n", \ CVMopnames[pc[0]], STACK_INT(-1), num)); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); OPC_ISTORE_n(0); OPC_ISTORE_n(1); OPC_ISTORE_n(2); OPC_ISTORE_n(3);#undef OPC_LSTORE_n#define OPC_LSTORE_n(num) \ CASE(opc_lstore_##num, 1) \ CVMmemCopy64(&locals[num].j.raw, &STACK_INFO(-2).raw); \ TRACE(("\t%s %s => locals[%d]\n", \ CVMopnames[pc[0]], \ GET_LONGCSTRING(STACK_LONG(-2)), num)); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2); OPC_LSTORE_n(0); OPC_LSTORE_n(1); OPC_LSTORE_n(2); OPC_LSTORE_n(3);#undef OPC_FSTORE_n#define OPC_FSTORE_n(num) \ CASE(opc_fstore_##num, 1) \ locals[num] = STACK_SLOT(-1); \ TRACE(("\t%s %f => locals[%d]\n", \ CVMopnames[pc[0]], STACK_FLOAT(-1), num)); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); OPC_FSTORE_n(0); OPC_FSTORE_n(1); OPC_FSTORE_n(2); OPC_FSTORE_n(3);#undef OPC_DSTORE_n#define OPC_DSTORE_n(num) \ CASE(opc_dstore_##num, 1) \ CVMmemCopy64(&locals[num].j.raw, &STACK_INFO(-2).raw); \ TRACE(("\t%s %f => locals[%d]\n", \ CVMopnames[pc[0]], STACK_DOUBLE(-2), num)); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2); OPC_DSTORE_n(0); OPC_DSTORE_n(1); OPC_DSTORE_n(2); OPC_DSTORE_n(3);#undef OPC_ASTORE_n#define OPC_ASTORE_n(num) \ CASE(opc_astore_##num, 1) \ locals[num] = STACK_SLOT(-1); \ TRACE(("\t%s 0x%x => locals[%d]\n", \ CVMopnames[pc[0]], STACK_OBJECT(-1), num)); \ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); OPC_ASTORE_n(0); OPC_ASTORE_n(1); OPC_ASTORE_n(2); OPC_ASTORE_n(3); /* Array store opcodes */ /* 32-bit stores. These handle conversion to < 32-bit types */#define ARRAY_STOREFROM32(T, format, stackSrc) \ { \ ARRAY_INTRO(T, -3); \ CVMD_arrayWrite##T(arrObj, index, stackSrc(-1)); \ TRACE(("\t%s " format " ==> %O[%d] ==>\n", CVMopnames[pc[0]], \ stackSrc(-1), arrObj, index)); \ UPDATE_PC_AND_TOS_AND_CONTINUE_1_m3; \ } /* 64-bit stores */#define ARRAY_STOREFROM64(T) \ { \ CVMJava##T temp64; \ ARRAY_INTRO(T, -4); \ temp64 = CVMjvm2##T(&STACK_INFO(-2).raw); \ CVMD_arrayWrite##T(arrObj, index, temp64); \ TRACE(("\t%s (0x%X, 0x%X) ==> %O[%d]\n", CVMopnames[pc[0]], \ STACK_INT(-2), STACK_INT(-1), arrObj, index)); \ UPDATE_PC_AND_TOS_AND_CONTINUE_1_m4; \ } CASE(opc_iastore, 1) ARRAY_STOREFROM32(Int, "%d", STACK_INT); CASE(opc_lastore, 1) ARRAY_STOREFROM64(Long); CASE(opc_fastore, 1) ARRAY_STOREFROM32(Float, "%f", STACK_FLOAT); CASE(opc_dastore, 1) goto opc_dastore_overflow; /* * This one looks different because of the assignability check */ CASE(opc_aastore, 1) goto opc_aastore_overflow; CASE(opc_bastore, 1) ARRAY_STOREFROM32(Byte, "%d", STACK_INT); CASE(opc_castore, 1) ARRAY_STOREFROM32(Char, "%d", STACK_INT); CASE(opc_sastore, 1) ARRAY_STOREFROM32(Short, "%d", STACK_INT); /* stack pop, dup, and insert opcodes */ CASE(opc_pop, 1) /* Discard the top item on the stack */ TRACE(("\tpop\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); CASE(opc_pop2, 1) /* Discard the top 2 items on the stack */ TRACE(("\tpop2\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2); CASE(opc_dup, 1) { /* Duplicate the top item on the stack */ CVMJavaVal32 rhs = STACK_INFO(-1); topOfStack += 1; pc += 1; STACK_INFO(-1) = rhs; TRACE(("\tdup\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(0, 0); } CASE(opc_dup_x1, 1) /* insert top word two down */ STACK_INFO(0) = STACK_INFO(-1); STACK_INFO(-1) = STACK_INFO(-2); STACK_INFO(-2) = STACK_INFO(0); TRACE(("\tdup_x1\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); CASE(opc_dup_x2, 1) /* insert top word three down */ STACK_INFO(0) = STACK_INFO(-1); STACK_INFO(-1) = STACK_INFO(-2); STACK_INFO(-2) = STACK_INFO(-3); STACK_INFO(-3) = STACK_INFO(0); TRACE(("\tdup_x2\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); CASE(opc_dup2, 1) /* Duplicate the top 2 items on the stack */ STACK_INFO(0) = STACK_INFO(-2); STACK_INFO(1) = STACK_INFO(-1); TRACE(("\tdup2\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2); CASE(opc_dup2_x1, 1) /* insert top double three down */ STACK_INFO(1) = STACK_INFO(-1); STACK_INFO(0) = STACK_INFO(-2); STACK_INFO(-1) = STACK_INFO(-3); STACK_INFO(-2) = STACK_INFO(1); STACK_INFO(-3) = STACK_INFO(0); TRACE(("\tdup2_x1\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2); CASE(opc_dup2_x2, 1) /* insert top double four down */ STACK_INFO(1) = STACK_INFO(-1); STACK_INFO(0) = STACK_INFO(-2); STACK_INFO(-1) = STACK_INFO(-3); STACK_INFO(-2) = STACK_INFO(-4); STACK_INFO(-3) = STACK_INFO(1); STACK_INFO(-4) = STACK_INFO(0); TRACE(("\tdup2_x2\n")); UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?