1HANDLE_OPCODE(OP_APUT_OBJECT /*vAA, vBB, vCC*/) 2 { 3 ArrayObject* arrayObj; 4 Object* obj; 5 u2 arrayInfo; 6 EXPORT_PC(); 7 vdst = INST_AA(inst); /* AA: source value */ 8 arrayInfo = FETCH(1); 9 vsrc1 = arrayInfo & 0xff; /* BB: array ptr */ 10 vsrc2 = arrayInfo >> 8; /* CC: index */ 11 ILOGV("|aput%s v%d,v%d,v%d", "-object", vdst, vsrc1, vsrc2); 12 arrayObj = (ArrayObject*) GET_REGISTER(vsrc1); 13 if (!checkForNull((Object*) arrayObj)) 14 GOTO_exceptionThrown(); 15 if (GET_REGISTER(vsrc2) >= arrayObj->length) { 16 dvmThrowException("Ljava/lang/ArrayIndexOutOfBoundsException;", 17 NULL); 18 GOTO_exceptionThrown(); 19 } 20 obj = (Object*) GET_REGISTER(vdst); 21 if (obj != NULL) { 22 if (!checkForNull(obj)) 23 GOTO_exceptionThrown(); 24 if (!dvmCanPutArrayElement(obj->clazz, arrayObj->obj.clazz)) { 25 LOGV("Can't put a '%s'(%p) into array type='%s'(%p)\n", 26 obj->clazz->descriptor, obj, 27 arrayObj->obj.clazz->descriptor, arrayObj); 28 //dvmDumpClass(obj->clazz); 29 //dvmDumpClass(arrayObj->obj.clazz); 30 dvmThrowException("Ljava/lang/ArrayStoreException;", NULL); 31 GOTO_exceptionThrown(); 32 } 33 } 34 ILOGV("+ APUT[%d]=0x%08x", GET_REGISTER(vsrc2), GET_REGISTER(vdst)); 35 dvmSetObjectArrayElement(arrayObj, 36 GET_REGISTER(vsrc2), 37 (Object *)GET_REGISTER(vdst)); 38 } 39 FINISH(2); 40OP_END 41