1 %verify "executed" 2 %verify "unknown method" 3 /* 4 * Handle a jumbo direct method call. 5 * 6 * (We could defer the "is 'this' pointer null" test to the common 7 * method invocation code, and use a flag to indicate that static 8 * calls don't count. If we do this as part of copying the arguments 9 * out we could avoiding loading the first arg twice.) 10 */ 11 /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */ 12 movl rSELF,%ecx 13 movl 2(rPC),%eax # eax<- AAAAAAAA 14 movl offThread_methodClassDex(%ecx),%ecx # ecx<- pDvmDex 15 EXPORT_PC 16 movl offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods 17 movzwl 8(rPC),rIBASE # rIBASE<- CCCC 18 movl (%ecx,%eax,4),%eax # eax<- resolved methodToCall 19 testl %eax,%eax # already resolved? 20 GET_VREG_R %ecx rIBASE # ecx<- "this" ptr 21 je .L${opcode}_resolve # not resolved, do it now 22 .L${opcode}_finish: 23 testl %ecx,%ecx # null "this"? 24 jne common_invokeMethodJumbo # no, continue on 25 jmp common_errNullObject 26 27 /* 28 * On entry: 29 * TMP_SPILL <- "this" register 30 * Things a bit ugly on this path, but it's the less 31 * frequent one. We'll have to do some reloading. 32 */ 33 .L${opcode}_resolve: 34 SPILL_TMP1(%ecx) 35 movl rSELF,%ecx 36 movl offThread_method(%ecx),%ecx # ecx<- self->method 37 movl 2(rPC),%eax # reference AAAAAAAA 38 movl offMethod_clazz(%ecx),%ecx # ecx<- method->clazz 39 movl $$METHOD_DIRECT,OUT_ARG2(%esp) 40 movl %eax,OUT_ARG1(%esp) 41 movl %ecx,OUT_ARG0(%esp) 42 call dvmResolveMethod # eax<- call(clazz, ref, flags) 43 UNSPILL_TMP1(%ecx) 44 testl %eax,%eax 45 jne .L${opcode}_finish 46 jmp common_exceptionThrown 47