- insn_iastore:
- SAVE_PC;
- {
- jint value = POPI();
- jint index = POPI();
- jintArray arr = (jintArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_lastore:
- SAVE_PC;
- {
- jlong value = POPL();
- jint index = POPI();
- jlongArray arr = (jlongArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_fastore:
- SAVE_PC;
- {
- jfloat value = POPF();
- jint index = POPI();
- jfloatArray arr = (jfloatArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_dastore:
- SAVE_PC;
- {
- jdouble value = POPD();
- jint index = POPI();
- jdoubleArray arr = (jdoubleArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_aastore:
- SAVE_PC;
- {
- jobject value = POPA();
- jint index = POPI();
- jobjectArray arr = (jobjectArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- _Jv_CheckArrayStore (arr, value);
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_bastore:
- SAVE_PC;
- {
- jbyte value = (jbyte) POPI();
- jint index = POPI();
- jbyteArray arr = (jbyteArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_castore:
- SAVE_PC;
- {
- jchar value = (jchar) POPI();
- jint index = POPI();
- jcharArray arr = (jcharArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_sastore:
- SAVE_PC;
- {
- jshort value = (jshort) POPI();
- jint index = POPI();
- jshortArray arr = (jshortArray) POPA();
- NULLCHECK (arr);
- if (index < 0 || index >= arr->length)
- {
- _Jv_ThrowBadArrayIndex (index);
- }
- elements(arr)[index] = value;
- }
- NEXT_INSN;
-
- insn_pop:
- sp -= 1;
- NEXT_INSN;
-
- insn_pop2:
- sp -= 2;
- NEXT_INSN;
-
- insn_dup:
- sp[0] = sp[-1];
- sp += 1;
- NEXT_INSN;
-
- insn_dup_x1:
- dupx (sp, 1, 1); sp+=1;
- NEXT_INSN;
-
- insn_dup_x2:
- dupx (sp, 1, 2); sp+=1;
- NEXT_INSN;
-
- insn_dup2:
- sp[0] = sp[-2];
- sp[1] = sp[-1];
- sp += 2;
- NEXT_INSN;
-
- insn_dup2_x1:
- dupx (sp, 2, 1); sp+=2;
- NEXT_INSN;
-
- insn_dup2_x2:
- dupx (sp, 2, 2); sp+=2;
- NEXT_INSN;
-
- insn_swap:
- {
- jobject tmp1 = POPA();
- jobject tmp2 = POPA();
- PUSHA (tmp1);
- PUSHA (tmp2);
- }
- NEXT_INSN;
-
- insn_iadd:
- BINOPI(+);
- NEXT_INSN;
-
- insn_ladd:
- BINOPL(+);
- NEXT_INSN;
-
- insn_fadd:
- BINOPF(+);
- NEXT_INSN;
-
- insn_dadd:
- BINOPD(+);
- NEXT_INSN;
-
- insn_isub:
- BINOPI(-);
- NEXT_INSN;
-
- insn_lsub:
- BINOPL(-);
- NEXT_INSN;
-
- insn_fsub:
- BINOPF(-);
- NEXT_INSN;
-
- insn_dsub:
- BINOPD(-);
- NEXT_INSN;
-
- insn_imul:
- BINOPI(*);
- NEXT_INSN;
-
- insn_lmul:
- BINOPL(*);
- NEXT_INSN;
-
- insn_fmul:
- BINOPF(*);
- NEXT_INSN;
-
- insn_dmul:
- BINOPD(*);
- NEXT_INSN;
-
- insn_idiv:
- SAVE_PC;
- {
- jint value2 = POPI();
- jint value1 = POPI();
- jint res = _Jv_divI (value1, value2);
- PUSHI (res);
- }
- NEXT_INSN;
-
- insn_ldiv:
- SAVE_PC;
- {
- jlong value2 = POPL();
- jlong value1 = POPL();
- jlong res = _Jv_divJ (value1, value2);
- PUSHL (res);
- }
- NEXT_INSN;
-
- insn_fdiv:
- SAVE_PC;
- {
- jfloat value2 = POPF();
- jfloat value1 = POPF();
- jfloat res = value1 / value2;
- PUSHF (res);
- }
- NEXT_INSN;
-
- insn_ddiv:
- SAVE_PC;
- {
- jdouble value2 = POPD();
- jdouble value1 = POPD();
- jdouble res = value1 / value2;
- PUSHD (res);
- }
- NEXT_INSN;
-
- insn_irem:
- SAVE_PC;
- {
- jint value2 = POPI();
- jint value1 = POPI();
- jint res = _Jv_remI (value1, value2);
- PUSHI (res);
- }
- NEXT_INSN;
-
- insn_lrem:
- SAVE_PC;
- {
- jlong value2 = POPL();
- jlong value1 = POPL();
- jlong res = _Jv_remJ (value1, value2);
- PUSHL (res);
- }
- NEXT_INSN;
-
- insn_frem:
- SAVE_PC;
- {
- jfloat value2 = POPF();
- jfloat value1 = POPF();
- jfloat res = __ieee754_fmod (value1, value2);
- PUSHF (res);
- }
- NEXT_INSN;
-
- insn_drem:
- SAVE_PC;
- {
- jdouble value2 = POPD();
- jdouble value1 = POPD();
- jdouble res = __ieee754_fmod (value1, value2);
- PUSHD (res);
- }
- NEXT_INSN;
-
- insn_ineg:
- {
- jint value = POPI();
- PUSHI (value * -1);
- }
- NEXT_INSN;
-
- insn_lneg:
- {
- jlong value = POPL();
- PUSHL (value * -1);
- }
- NEXT_INSN;
-
- insn_fneg:
- {
- jfloat value = POPF();
- PUSHF (value * -1);
- }
- NEXT_INSN;
-
- insn_dneg:
- {
- jdouble value = POPD();
- PUSHD (value * -1);
- }
- NEXT_INSN;
-
- insn_ishl:
- {
- jint shift = (POPI() & 0x1f);
- jint value = POPI();
- PUSHI (value << shift);
- }
- NEXT_INSN;
-
- insn_lshl:
- {
- jint shift = (POPI() & 0x3f);
- jlong value = POPL();
- PUSHL (value << shift);
- }
- NEXT_INSN;
-
- insn_ishr:
- {
- jint shift = (POPI() & 0x1f);
- jint value = POPI();
- PUSHI (value >> shift);
- }
- NEXT_INSN;
-
- insn_lshr:
- {
- jint shift = (POPI() & 0x3f);
- jlong value = POPL();
- PUSHL (value >> shift);
- }
- NEXT_INSN;
-
- insn_iushr:
- {
- jint shift = (POPI() & 0x1f);
- unsigned long value = POPI();
- PUSHI ((jint) (value >> shift));
- }
- NEXT_INSN;
-
- insn_lushr:
- {
- jint shift = (POPI() & 0x3f);
- UINT64 value = (UINT64) POPL();
- PUSHL ((value >> shift));
- }
- NEXT_INSN;
-
- insn_iand:
- BINOPI (&);
- NEXT_INSN;
-
- insn_land:
- BINOPL (&);
- NEXT_INSN;
-
- insn_ior:
- BINOPI (|);
- NEXT_INSN;
-
- insn_lor:
- BINOPL (|);
- NEXT_INSN;
-
- insn_ixor:
- BINOPI (^);
- NEXT_INSN;
-
- insn_lxor:
- BINOPL (^);
- NEXT_INSN;
-
- insn_iinc:
- {
- jint index = get1u (pc++);
- jint amount = get1s (pc++);
- locals[index].i += amount;
- }
- NEXT_INSN;
-
- insn_i2l:
- {jlong value = POPI(); PUSHL (value);}
- NEXT_INSN;
-
- insn_i2f:
- {jfloat value = POPI(); PUSHF (value);}
- NEXT_INSN;
-
- insn_i2d:
- {jdouble value = POPI(); PUSHD (value);}
- NEXT_INSN;
-
- insn_l2i:
- {jint value = POPL(); PUSHI (value);}
- NEXT_INSN;
-
- insn_l2f:
- {jfloat value = POPL(); PUSHF (value);}
- NEXT_INSN;
-
- insn_l2d:
- {jdouble value = POPL(); PUSHD (value);}
- NEXT_INSN;
-
- insn_f2i:
- { jint value = (jint)POPF (); PUSHI(value); }
- NEXT_INSN;
-
- insn_f2l:
- { jlong value = (jlong)POPF (); PUSHL(value); }
- NEXT_INSN;
-
- insn_f2d:
- { jdouble value = POPF (); PUSHD(value); }
- NEXT_INSN;
-
- insn_d2i:
- { jint value = (jint)POPD (); PUSHI(value); }
- NEXT_INSN;
-
- insn_d2l:
- { jlong value = (jlong)POPD (); PUSHL(value); }
- NEXT_INSN;
-
- insn_d2f:
- { jfloat value = POPD (); PUSHF(value); }
- NEXT_INSN;
-
- insn_i2b:
- { jbyte value = POPI (); PUSHI(value); }
- NEXT_INSN;
-
- insn_i2c:
- { jchar value = POPI (); PUSHI(value); }
- NEXT_INSN;
-
- insn_i2s:
- { jshort value = POPI (); PUSHI(value); }
- NEXT_INSN;
-
- insn_lcmp:
- {
- jlong value2 = POPL ();
- jlong value1 = POPL ();
- if (value1 > value2)
- { PUSHI (1); }
- else if (value1 == value2)
- { PUSHI (0); }
- else
- { PUSHI (-1); }
- }
- NEXT_INSN;
-
- insn_fcmpl:
- insn_fcmpg:
- {
- jfloat value2 = POPF ();
- jfloat value1 = POPF ();
- if (value1 > value2)
- PUSHI (1);
- else if (value1 == value2)
- PUSHI (0);
- else if (value1 < value2)
- PUSHI (-1);
- else if ((*(pc-1)) == op_fcmpg)
- PUSHI (1);
- else
- PUSHI (-1);
- }
- NEXT_INSN;
-
- insn_dcmpl:
- insn_dcmpg:
- {
- jdouble value2 = POPD ();
- jdouble value1 = POPD ();
- if (value1 > value2)
- PUSHI (1);
- else if (value1 == value2)
- PUSHI (0);
- else if (value1 < value2)
- PUSHI (-1);
- else if ((*(pc-1)) == op_dcmpg)
- PUSHI (1);
- else
- PUSHI (-1);
- }
- NEXT_INSN;
-
- insn_ifeq:
- {
- jint offset = get2s (pc);
- if (POPI() == 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_ifne:
- {
- jint offset = get2s (pc);
- if (POPI() != 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_iflt:
- {
- jint offset = get2s (pc);
- if (POPI() < 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_ifge:
- {
- jint offset = get2s (pc);
- if (POPI() >= 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_ifgt:
- {
- jint offset = get2s (pc);
- if (POPI() > 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_ifle:
- {
- jint offset = get2s (pc);
- if (POPI() <= 0)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmpeq:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 == value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmpne:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 != value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmplt:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 < value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmpge:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 >= value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmpgt:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 > value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_icmple:
- {
- jint offset = get2s (pc);
- jint value2 = POPI();
- jint value1 = POPI();
- if (value1 <= value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_acmpeq:
- {
- jint offset = get2s (pc);
- jobject value2 = POPA();
- jobject value1 = POPA();
- if (value1 == value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_if_acmpne:
- {
- jint offset = get2s (pc);
- jobject value2 = POPA();
- jobject value1 = POPA();
- if (value1 != value2)
- pc = pc-1+offset;
- else
- pc = pc+2;
- }
- NEXT_INSN;
-
- insn_goto:
- {
- jint offset = get2s (pc);
- pc = pc-1+offset;
- }
- NEXT_INSN;
-
- insn_jsr:
- {
- unsigned char *base_pc = pc-1;
- jint offset = get2s (pc); pc += 2;
- PUSHA ((jobject)pc);
- pc = base_pc+offset;
- }
- NEXT_INSN;
-
- insn_ret:
- {
- jint index = get1u (pc);
- pc = (unsigned char*) PEEKA (index);
- }
- NEXT_INSN;
-
- insn_tableswitch:
- {
- unsigned char *base_pc = pc-1;
- int index = POPI();
-
- unsigned char* base = bytecode ();
- while ((pc-base) % 4 != 0)
- pc++;
-
- jint def = get4 (pc);
- jint low = get4 (pc+4);
- jint high = get4 (pc+8);
-
- if (index < low || index > high)
- pc = base_pc + def;
- else
- pc = base_pc + get4 (pc+4*(index-low+3));
- }
- NEXT_INSN;
-
- insn_lookupswitch:
- {
- unsigned char *base_pc = pc-1;
- int index = POPI();
-
- unsigned char* base = bytecode ();
- while ((pc-base) % 4 != 0)
- pc++;
-
- jint def = get4 (pc);
- jint npairs = get4 (pc+4);
-
- int max = npairs-1;
- int min = 0;
-
- // simple binary search...
- while (min < max)
- {
- int half = (min+max)/2;
- int match = get4 (pc+ 4*(2 + 2*half));
-
- if (index == match)
- min = max = half;
-
- else if (index < match)
- max = half-1;
-
- else
- min = half+1;
- }
-
- if (index == get4 (pc+ 4*(2 + 2*min)))
- pc = base_pc + get4 (pc+ 4*(2 + 2*min + 1));
- else
- pc = base_pc + def;
- }
- NEXT_INSN;
-
- /* on return, just save the sp and return to caller */
- insn_ireturn:
- insn_lreturn:
- insn_freturn:
- insn_dreturn:
- insn_areturn:
- insn_return:
- inv->sp = sp;
- return;
-
- insn_getstatic:
- SAVE_PC;
- {
- jint fieldref_index = get2u (pc); pc += 2;
- _Jv_ResolvePoolEntry (defining_class, fieldref_index);
- _Jv_Field *field = pool_data[fieldref_index].field;
-
- if ((field->flags & Modifier::STATIC) == 0)
- throw_incompatible_class_change_error
- (JvNewStringLatin1 ("field no longer static"));
-
- jclass type = field->type;
-
- if (type->isPrimitive ())
- {
- switch (type->size_in_bytes)
- {
- case 1:
- PUSHI (*(jbyte*) (field->u.addr));
- break;
-
- case 2:
- if (type == JvPrimClass (char))
- PUSHI(*(jchar*) (field->u.addr));
- else
- PUSHI(*(jshort*) (field->u.addr));
- break;
-
- case 4:
- PUSHI(*(jint*) (field->u.addr));
- break;
-
- case 8:
- PUSHL(*(jlong*) (field->u.addr));
- break;
- }
- }
- else
- {
- PUSHA(*(jobject*) (field->u.addr));
- }
- }
- NEXT_INSN;
-
- insn_getfield:
- SAVE_PC;
- {
- jint fieldref_index = get2u (pc); pc += 2;
- _Jv_ResolvePoolEntry (defining_class, fieldref_index);
- _Jv_Field *field = pool_data[fieldref_index].field;
-
- if ((field->flags & Modifier::STATIC) != 0)
- throw_incompatible_class_change_error
- (JvNewStringLatin1 ("field is static"));
-
- jclass type = field->type;
- jint field_offset = field->u.boffset;
- if (field_offset > 0xffff)
- JvThrow (new java::lang::VirtualMachineError);
-
- jobject obj = POPA();
- NULLCHECK(obj);
-
- if (type->isPrimitive ())
- {
- switch (type->size_in_bytes)
- {
- case 1:
- PUSHI (*(jbyte*) ((char*)obj + field_offset));
- break;
-
- case 2:
- if (type == JvPrimClass (char))
- PUSHI (*(jchar*) ((char*)obj + field_offset));
- else
- PUSHI (*(jshort*) ((char*)obj + field_offset));
- break;
-
- case 4:
- PUSHI (*(jint*) ((char*)obj + field_offset));
- break;
-
- case 8:
- PUSHL(*(jlong*) ((char*)obj + field_offset));
- break;
- }
- }
- else
- {
- PUSHA(*(jobject*) ((char*)obj + field_offset));
- }
- }
- NEXT_INSN;
-
- insn_putstatic:
- SAVE_PC;
- {
- jint fieldref_index = get2u (pc); pc += 2;
- _Jv_ResolvePoolEntry (defining_class, fieldref_index);
- _Jv_Field *field = pool_data[fieldref_index].field;
-
- jclass type = field->type;
-
- // ResolvePoolEntry cannot check this
- if ((field->flags & Modifier::STATIC) == 0)
- throw_incompatible_class_change_error
- (JvNewStringLatin1 ("field no longer static"));
-
- if (type->isPrimitive ())
- {
- switch (type->size_in_bytes)
- {
- case 1:
- {
- jint value = POPI();
- *(jbyte*) (field->u.addr) = value;
- break;
- }
-
- case 2:
- {
- jint value = POPI();
- *(jchar*) (field->u.addr) = value;
- break;
- }
-
- case 4:
- {
- jint value = POPI();
- *(jint*) (field->u.addr) = value;
- break;
- }
-
- case 8:
- {
- jlong value = POPL();
- *(jlong*) (field->u.addr) = value;
- break;
- }
- }
- }
- else
- {
- jobject value = POPA();
- *(jobject*) (field->u.addr) = value;
- }
- }
- NEXT_INSN;
-
-
- insn_putfield:
- SAVE_PC;
- {
- jint fieldref_index = get2u (pc); pc += 2;
- _Jv_ResolvePoolEntry (defining_class, fieldref_index);
- _Jv_Field *field = pool_data[fieldref_index].field;
-
- jclass type = field->type;
-
- if ((field->flags & Modifier::STATIC) != 0)
- throw_incompatible_class_change_error
- (JvNewStringLatin1 ("field is static"));
-
- jint field_offset = field->u.boffset;
- if (field_offset > 0xffff)
- JvThrow (new java::lang::VirtualMachineError);
-
- if (type->isPrimitive ())
- {
- switch (type->size_in_bytes)
- {
- case 1:
- {
- jint value = POPI();
- jobject obj = POPA();
- NULLCHECK(obj);
- *(jbyte*) ((char*)obj + field_offset) = value;
- break;
- }
-
- case 2:
- {
- jint value = POPI();
- jobject obj = POPA();
- NULLCHECK(obj);
- *(jchar*) ((char*)obj + field_offset) = value;
- break;
- }
-
- case 4:
- {
- jint value = POPI();
- jobject obj = POPA();
- NULLCHECK(obj);
- *(jint*) ((char*)obj + field_offset) = value;
- break;
- }
-
- case 8:
- {
- jlong value = POPL();
- jobject obj = POPA();
- NULLCHECK(obj);
- *(jlong*) ((char*)obj + field_offset) = value;
- break;
- }
- }
- }
- else
- {
- jobject value = POPA();
- jobject obj = POPA();
- NULLCHECK(obj);
- *(jobject*) ((char*)obj + field_offset) = value;
- }
- }
- NEXT_INSN;
-
- insn_invokespecial:
- SAVE_PC;
- {
- int index = get2u (pc); pc += 2;
-
- rmeth = (_Jv_ResolvePoolEntry (defining_class, index)).rmethod;
-
- sp -= rmeth->stack_item_count;
-
- NULLCHECK (sp[0].o);
-
- fun = (void (*)()) rmeth->method->ncode;
- }
- goto perform_invoke;
-
- insn_invokestatic:
- SAVE_PC;
- {
- int index = get2u (pc); pc += 2;
-
- rmeth = (_Jv_ResolvePoolEntry (defining_class, index)).rmethod;
-
- sp -= rmeth->stack_item_count;
-
- _Jv_InitClass (rmeth->klass);
- fun = (void (*)()) rmeth->method->ncode;
- }
- goto perform_invoke;
-
- insn_invokeinterface:
- SAVE_PC;
- {
- int index = get2u (pc); pc += 2;
-
- // invokeinterface has two unused bytes...
- pc += 2;
-
- rmeth = (_Jv_ResolvePoolEntry (defining_class, index)).rmethod;
-
- sp -= rmeth->stack_item_count;
-
- jobject rcv = sp[0].o;
-
- NULLCHECK (rcv);
-
- fun = (void (*)())
- _Jv_LookupInterfaceMethod (rcv->getClass (),
- rmeth->method->name,
- rmeth->method->signature);
- }
- goto perform_invoke;
-
-
- insn_new:
- SAVE_PC;
- {
- int index = get2u (pc); pc += 2;
- jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
- _Jv_InitClass (klass);
- jobject res = _Jv_AllocObject (klass, klass->size_in_bytes);
- PUSHA (res);
- }
- NEXT_INSN;
-
- insn_newarray:
- SAVE_PC;
- {
- int atype = get1u (pc++);
- int size = POPI();
- jobject result = _Jv_NewArray (atype, size);
- PUSHA (result);
- }
- NEXT_INSN;
-
- insn_anewarray:
- SAVE_PC;
- {
- int index = get2u (pc); pc += 2;
- jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
- int size = POPI();
- _Jv_InitClass (klass);
- jobject result = _Jv_NewObjectArray (size, klass, 0);
- PUSHA (result);
- }
- NEXT_INSN;
-
- insn_arraylength:
- SAVE_PC;
- {
- __JArray *arr = (__JArray*)POPA();
- PUSHI (arr->length);
- }
- NEXT_INSN;
-
- insn_athrow:
- SAVE_PC;
- {
- jobject value = POPA();
- JvThrow (value);
- }
- NEXT_INSN;
-
- insn_checkcast:
- SAVE_PC;
- {
- jobject value = POPA();
- jint index = get2u (pc); pc += 2;
- jclass to = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
-
- if (value != NULL && ! to->isInstance (value))
- {
- JvThrow (new java::lang::ClassCastException
- (to->getName()));
- }
-
- PUSHA (value);
- }
- NEXT_INSN;
-
- insn_instanceof:
- SAVE_PC;
- {
- jobject value = POPA();
- jint index = get2u (pc); pc += 2;
- jclass to = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
- PUSHI (to->isInstance (value));
- }
- NEXT_INSN;