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