blob: 5794cb1b871a24d915fe795ac7abaa7a3cd256a3 [file] [log] [blame]
%verify "executed"
%verify "unknown method"
/*
* Handle a "super" method call.
*/
/* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
FETCH(t0, 4) # t0<- CCCC
LOAD_rSELF_methodClassDex(a3) # a3 <- pDvmDex
FETCH(a0, 1) # a0<- aaaa (lo)
FETCH(a1, 2) # a1<- AAAA (hi)
LOAD_base_offDvmDex_pResMethods(a3, a3) # a3 <- pDvmDex->pResMethods
sll a1,a1,16
or a1, a0, a1 # a1<- AAAAaaaa
GET_VREG(rOBJ, t0) # rOBJ <- "this" ptr
LOAD_eas2(a0, a3, a1) # a0 <- resolved baseMethod
# null "this"?
LOAD_rSELF_method(t1) # t1 <- current method
beqz rOBJ, common_errNullObject # null "this", throw exception
# cmp a0, 0; already resolved?
LOAD_base_offMethod_clazz(rBIX, t1) # rBIX <- method->clazz
EXPORT_PC() # must export for invoke
bnez a0, .L${opcode}_continue # resolved, continue on
move a0, rBIX # a0 <- method->clazz
li a2, METHOD_VIRTUAL # resolver method type
JAL(dvmResolveMethod) # v0 <- call(clazz, ref, flags)
move a0, v0
# got null?
beqz v0, common_exceptionThrown # yes, handle exception
b .L${opcode}_continue
%break
/*
* At this point:
* a0 = resolved base method
* rBIX = method->clazz
*/
.L${opcode}_continue:
LOAD_base_offClassObject_super(a1, rBIX) # a1 <- method->clazz->super
LOADu2_offMethod_methodIndex(a2, a0) # a2 <- baseMethod->methodIndex
LOAD_base_offClassObject_vtableCount(a3, a1) # a3 <- super->vtableCount
EXPORT_PC() # must export for invoke
# compare (methodIndex, vtableCount)
bgeu a2, a3, .L${opcode}_nsm # method not present in superclass
LOAD_base_offClassObject_vtable(a1, a1) # a1 <- ...clazz->super->vtable
LOAD_eas2(a0, a1, a2) # a0 <- vtable[methodIndex]
b common_invokeMethodJumbo # a0=method rOBJ="this"
/*
* Throw a NoSuchMethodError with the method name as the message.
* a0 = resolved base method
*/
.L${opcode}_nsm:
LOAD_base_offMethod_name(a1, a0) # a1 <- method name
b common_errNoSuchMethod