HANDLE_OPCODE(OP_NEW_ARRAY)1 HANDLE_OPCODE(OP_NEW_ARRAY /*vA, vB, class@CCCC*/)
2 {
3 ClassObject* arrayClass;
4 ArrayObject* newArray;
5 s4 length;
6
7 EXPORT_PC();
8
9 vdst = INST_A(inst);
10 vsrc1 = INST_B(inst); /* length reg */
11 ref = FETCH(1);
12 ILOGV("|new-array v%d,v%d,class@0x%04x (%d elements)",
13 vdst, vsrc1, ref, (s4) GET_REGISTER(vsrc1));
14 length = (s4) GET_REGISTER(vsrc1);
15 if (length < 0) {
16 dvmThrowNegativeArraySizeException(length);
17 GOTO_exceptionThrown();
18 }
19 arrayClass = dvmDexGetResolvedClass(methodClassDex, ref);
20 if (arrayClass == NULL) {
21 arrayClass = dvmResolveClass(curMethod->clazz, ref, false);
22 if (arrayClass == NULL)
23 GOTO_exceptionThrown();
24 }
25 /* verifier guarantees this is an array class */
26 assert(dvmIsArrayClass(arrayClass));
27 assert(dvmIsClassInitialized(arrayClass));
28
29 newArray = dvmAllocArrayByClass(arrayClass, length, ALLOC_DONT_TRACK);
30 if (newArray == NULL)
31 GOTO_exceptionThrown();
32 SET_REGISTER(vdst, (u4) newArray);
33 }
34 FINISH(2);
35 OP_END
36