1 %default { "routine":"NoRange","isrange":"0" } 2 %verify "executed" 3 %verify "unknown method" 4 /* 5 * Handle a static method call. 6 * 7 * for: invoke-static, invoke-static/range 8 */ 9 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 10 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 11 movl rSELF,%ecx 12 movzwl 2(rPC),%eax # eax<- BBBB 13 movl offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex 14 EXPORT_PC 15 movl offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods 16 movl (%ecx,%eax,4),%eax # eax<- resolved methodToCall 17 testl %eax,%eax 18 jne common_invokeMethod${routine} 19 movl rSELF,%ecx 20 movl offThread_method(%ecx),%ecx # ecx<- self->method 21 movzwl 2(rPC),%eax 22 movl offMethod_clazz(%ecx),%ecx# ecx<- method->clazz 23 movl %eax,OUT_ARG1(%esp) # arg1<- BBBB 24 movl %ecx,OUT_ARG0(%esp) # arg0<- clazz 25 movl $$METHOD_STATIC,%eax 26 movl %eax,OUT_ARG2(%esp) # arg2<- flags 27 call dvmResolveMethod # call(clazz,ref,flags) 28 testl %eax,%eax # got null? 29 jne common_invokeMethod${routine} 30 jmp common_exceptionThrown 31