1 %default { "isrange":"0", "routine":"NoRange" } 2 %verify "executed" 3 %verify "unknown method" 4 %verify "null object" 5 /* 6 * Handle an interface method call. 7 * 8 * for: invoke-interface, invoke-interface/range 9 */ 10 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 11 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 12 FETCH(a2, 2) # a2 <- FEDC or CCCC 13 FETCH(a1, 1) # a1 <- BBBB 14 .if (!$isrange) 15 and a2, 15 # a2 <- C (or stays CCCC) 16 .endif 17 EXPORT_PC() # must export for invoke 18 GET_VREG(rOBJ, a2) # rOBJ <- first arg ("this") 19 LOAD_rSELF_methodClassDex(a3) # a3 <- methodClassDex 20 LOAD_rSELF_method(a2) # a2 <- method 21 # null obj? 22 beqz rOBJ, common_errNullObject # yes, fail 23 LOAD_base_offObject_clazz(a0, rOBJ) # a0 <- thisPtr->clazz 24 JAL(dvmFindInterfaceMethodInCache) # v0 <- call(class, ref, method, dex) 25 move a0, v0 26 # failed? 27 beqz v0, common_exceptionThrown # yes, handle exception 28 b common_invokeMethod${routine} # (a0=method, rOBJ="this") 29