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