Home | History | Annotate | Download | only in mips
      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     GET_OPB(a0)                            #  a0 <- B
     13     FETCH(a2, 1)                           #  a2 <- CCCC
     14     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
     15     GET_VREG(a1, a0)                       #  a1 <- vB (array length)
     16     LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
     17     LOAD_eas2(a0, a3, a2)                  #  a0 <- resolved class
     18     # check length
     19     bltz      a1, common_errNegativeArraySize #  negative length, bail - len in a1
     20     EXPORT_PC()                            #  req'd for resolve, alloc
     21     # already resolved?
     22     beqz      a0, .L${opcode}_resolve
     23 
     24     /*
     25      * Finish allocation.
     26      *
     27      *  a0 holds class
     28      *  a1 holds array length
     29      */
     30 .L${opcode}_finish:
     31     li        a2, ALLOC_DONT_TRACK         #  don't track in local refs table
     32     JAL(dvmAllocArrayByClass)              #  v0 <- call(clazz, length, flags)
     33     GET_OPA4(a2)                           #  a2 <- A+
     34     # failed?
     35     beqz      v0, common_exceptionThrown   #  yes, handle the exception
     36     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
     37     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
     38     SET_VREG(v0, a2)                       #  vA <- v0
     39     GOTO_OPCODE(t0)                        #  jump to next instruction
     40 %break
     41 
     42     /*
     43      * Resolve class.  (This is an uncommon case.)
     44      *
     45      *  a1 holds array length
     46      *  a2 holds class ref CCCC
     47      */
     48 .L${opcode}_resolve:
     49     LOAD_rSELF_method(a3)                  #  a3 <- self->method
     50     move      rOBJ, a1                     #  rOBJ <- length (save)
     51     move      a1, a2                       #  a1 <- CCCC
     52     li        a2, 0                        #  a2 <- false
     53     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
     54     JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
     55     move      a1, rOBJ                     #  a1 <- length (restore)
     56     # got null?
     57     beqz      v0, common_exceptionThrown   #  yes, handle exception
     58     move      a0, v0
     59     b         .L${opcode}_finish           #  continue with ${opcode}_finish
     60 
     61 
     62