1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "negative array length" 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "allocation fails" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate an array of objects, specified with the array class 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and a count. 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The verifier guarantees that this is an array class, so we don't 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * check for it here. 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* new-array vA, vB, class@CCCC */ 129f601a917c8878204482c37aec7005054b6776fabuzbee movl rSELF,%ecx 13f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee EXPORT_PC 149f601a917c8878204482c37aec7005054b6776fabuzbee movl offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl 2(rPC),%eax # eax<- CCCC 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses 17a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee SPILL(rIBASE) 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl (%ecx,%eax,4),%ecx # ecx<- resolved class 19f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzbl rINSTbl,%eax 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sarl $$4,%eax # eax<- B 21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee GET_VREG_R %eax %eax # eax<- vB (array length) 22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee andb $$0xf,rINSTbl # rINST<- A 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %eax,%eax 248cb0d098d79af61546e275f633325794f4587602buzbee js common_errNegativeArraySize # bail, passing len in eax 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %ecx,%ecx # already resolved? 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jne .L${opcode}_finish # yes, fast path 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolve class. (This is an uncommon case.) 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds class (null here) 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax holds array length (vB) 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 329f601a917c8878204482c37aec7005054b6776fabuzbee movl rSELF,%ecx 33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SPILL_TMP1(%eax) # save array length 349f601a917c8878204482c37aec7005054b6776fabuzbee movl offThread_method(%ecx),%ecx # ecx<- self->method 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl 2(rPC),%eax # eax<- CCCC 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl offMethod_clazz(%ecx),%ecx # ecx<- method->clazz 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0,OUT_ARG2(%esp) 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG0(%esp) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmResolveClass # eax<- call(clazz,ref,flag) 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,%ecx 42f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee UNSPILL_TMP1(%eax) 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %ecx,%ecx # successful resolution? 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je common_exceptionThrown # no, bail. 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# fall through to ${opcode}_finish 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Finish allocation 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ecx holds class 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * eax holds array length (vB) 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %ecx,OUT_ARG0(%esp) 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl %eax,OUT_ARG1(%esp) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$ALLOC_DONT_TRACK,OUT_ARG2(%esp) 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project call dvmAllocArrayByClass # eax<- call(clazz,length,flags) 58a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee FETCH_INST_OPCODE 2 %ecx 59a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee UNSPILL(rIBASE) 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project testl %eax,%eax # failed? 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je common_exceptionThrown # yup - go handle 62f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee SET_VREG %eax rINST 63f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee ADVANCE_PC 2 64a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee GOTO_NEXT_R %ecx 65