1HANDLE_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);
35OP_END
36