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 movzwl 4(rPC),%eax # eax<- FEDC or CCCC 13 movl rSELF,%ecx 14 .if (!$isrange) 15 andl $$0xf,%eax # eax<- C (or stays CCCC) 16 .endif 17 GET_VREG_R %eax %eax # eax<- "this" 18 EXPORT_PC 19 testl %eax,%eax # null this? 20 je common_errNullObject # yes, fail 21 movl %eax, TMP_SPILL1(%ebp) 22 movl offObject_clazz(%eax),%eax# eax<- thisPtr->clazz 23 movl %eax,OUT_ARG0(%esp) # arg0<- class 24 movl offThread_methodClassDex(%ecx),%eax # eax<- methodClassDex 25 movl offThread_method(%ecx),%ecx # ecx<- method 26 movl %eax,OUT_ARG3(%esp) # arg3<- dex 27 movzwl 2(rPC),%eax # eax<- BBBB 28 movl %ecx,OUT_ARG2(%esp) # arg2<- method 29 movl %eax,OUT_ARG1(%esp) # arg1<- BBBB 30 call dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex) 31 testl %eax,%eax 32 je common_exceptionThrown 33 movl TMP_SPILL1(%ebp), %ecx 34 jmp common_invokeMethod${routine} 35