Home | History | Annotate | Download | only in x86
      1 
      2 %default { "isrange":"0", "routine":"NoRange" }
      3 %verify "executed"
      4 %verify "unknown method"
      5 %verify "null object"
      6     /*
      7      * Handle a virtual method call.
      8      *
      9      * for: invoke-virtual, invoke-virtual/range
     10      */
     11     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     12     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
     13     movl      rSELF,%eax
     14     movzwl    2(rPC),%ecx                 # ecx<- BBBB
     15     movl      offThread_methodClassDex(%eax),%eax  # eax<- pDvmDex
     16     EXPORT_PC
     17     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
     18     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
     19     testl     %eax,%eax                   # already resolved?
     20     jne       .L${opcode}_continue        # yes, continue
     21     movl      rSELF,%eax
     22     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
     23     movl      offThread_method(%eax),%eax   # eax<- self->method
     24     movl      offMethod_clazz(%eax),%eax  # ecx<- method->clazz
     25     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
     26     movl      $$METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
     27     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
     28     testl     %eax,%eax                   # got null?
     29     jne       .L${opcode}_continue        # no, continue
     30     jmp       common_exceptionThrown      # yes, handle exception
     31 
     32     /* At this point:
     33      *   eax = resolved base method
     34      *   ecx = scratch
     35      */
     36 .L${opcode}_continue:
     37     movzwl    4(rPC),%ecx               # ecx<- GFED or CCCC
     38     .if       (!$isrange)
     39     andl      $$0xf,%ecx                # ecx<- D (or stays CCCC)
     40     .endif
     41     GET_VREG_R  %ecx %ecx               # ecx<- "this"
     42     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
     43     testl     %ecx,%ecx                 # null this?
     44     je        common_errNullObject      # go if so
     45     movl      offObject_clazz(%ecx),%edx  # edx<- thisPtr->clazz
     46     movl      offClassObject_vtable(%edx),%edx # edx<- thisPtr->clazz->vtable
     47     movl      (%edx,%eax,4),%eax        # eax<- vtable[methodIndex]
     48     jmp       common_invokeMethod${routine}
     49