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