Home | History | Annotate | Download | only in c
      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             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);
     40 OP_END
     41