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