OP_APUT_OBJECT.cpp revision a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectHANDLE_OPCODE(OP_APUT_OBJECT /*vAA, vBB, vCC*/) 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* arrayObj; 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* obj; 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 arrayInfo; 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC(); 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vdst = INST_AA(inst); /* AA: source value */ 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arrayInfo = FETCH(1); 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vsrc1 = arrayInfo & 0xff; /* BB: array ptr */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vsrc2 = arrayInfo >> 8; /* CC: index */ 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ILOGV("|aput%s v%d,v%d,v%d", "-object", vdst, vsrc1, vsrc2); 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arrayObj = (ArrayObject*) GET_REGISTER(vsrc1); 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkForNull((Object*) arrayObj)) 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (GET_REGISTER(vsrc2) >= arrayObj->length) { 1674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein dvmThrowArrayIndexOutOfBoundsException( 1747f58250c5177adba475b0b11a36151ac0ce9ab9Dan Bornstein arrayObj->length, GET_REGISTER(vsrc2)); 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj = (Object*) GET_REGISTER(vdst); 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj != NULL) { 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!checkForNull(obj)) 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 24a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro if (!dvmCanPutArrayElement(obj->clazz, arrayObj->clazz)) { 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGV("Can't put a '%s'(%p) into array type='%s'(%p)\n", 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj->clazz->descriptor, obj, 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arrayObj->obj.clazz->descriptor, arrayObj); 28a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro dvmThrowArrayStoreExceptionIncompatibleElement(obj->clazz, arrayObj->clazz); 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_exceptionThrown(); 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ILOGV("+ APUT[%d]=0x%08x", GET_REGISTER(vsrc2), GET_REGISTER(vdst)); 33364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes dvmSetObjectArrayElement(arrayObj, 34364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes GET_REGISTER(vsrc2), 35364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes (Object *)GET_REGISTER(vdst)); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FINISH(2); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_END 39