OP_INVOKE_VIRTUAL_JUMBO.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
1%verify "executed"
2%verify "unknown method"
3%verify "null object"
4    /*
5     * Handle a virtual method call.
6     */
7     /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
9    FETCH(a0, 1)                           # a0<- aaaa (lo)
10    FETCH(a1, 2)                           # a1<- AAAA (hi)
11    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
12    sll     a1,a1,16
13    or      a1, a0, a1                     # a1<- AAAAaaaa
14    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
15    EXPORT_PC()                            #  must export for invoke
16    # already resolved?
17    bnez      a0, .L${opcode}_continue     #  yes, continue on
18
19    LOAD_rSELF_method(a3)                  #  a3 <- self->method
20    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
21    li        a2, METHOD_VIRTUAL           #  resolver method type
22    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
23    move      a0, v0
24    # got null?
25    bnez      v0, .L${opcode}_continue     #  no, continue
26    b         common_exceptionThrown       #  yes, handle exception
27%break
28
29    /*
30     * At this point:
31     *  a0 = resolved base method
32     *  rBIX= C or CCCC (index of first arg, which is the "this" ptr)
33     */
34.L${opcode}_continue:
35    FETCH(rBIX,4)                          #  rBIX <- CCCC
36    GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
37    LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
38    # is "this" null?
39    beqz      rOBJ, common_errNullObject   #  null "this", throw exception
40    LOAD_base_offObject_clazz(a3, rOBJ)    #  a3 <- thisPtr->clazz
41    LOAD_base_offClassObject_vtable(a3, a3) #  a3 <- thisPtr->clazz->vtable
42    LOAD_eas2(a0, a3, a2)                  #  a0 <- vtable[methodIndex]
43    b         common_invokeMethodJumbo     #  (a0=method, rOBJ="this")
44
45