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