HANDLE_OPCODE(OP_APUT_OBJECT)1 HANDLE_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 dvmThrowArrayIndexOutOfBoundsException(
17 arrayObj->length, GET_REGISTER(vsrc2));
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->clazz)) {
25 LOGV("Can't put a '%s'(%p) into array type='%s'(%p)",
26 obj->clazz->descriptor, obj,
27 arrayObj->obj.clazz->descriptor, arrayObj);
28 dvmThrowArrayStoreExceptionIncompatibleElement(obj->clazz, arrayObj->clazz);
29 GOTO_exceptionThrown();
30 }
31 }
32 ILOGV("+ APUT[%d]=0x%08x", GET_REGISTER(vsrc2), GET_REGISTER(vdst));
33 dvmSetObjectArrayElement(arrayObj,
34 GET_REGISTER(vsrc2),
35 (Object *)GET_REGISTER(vdst));
36 }
37 FINISH(2);
38 OP_END
39