Home | History | Annotate | Download | only in mips
      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     FETCH(a2, 2)                           #  a2 <- FEDC or CCCC
     13     FETCH(a1, 1)                           #  a1 <- BBBB
     14     .if (!$isrange)
     15     and       a2, 15                       #  a2 <- C (or stays CCCC)
     16     .endif
     17     EXPORT_PC()                            #  must export for invoke
     18     GET_VREG(rOBJ, a2)                     #  rOBJ <- first arg ("this")
     19     LOAD_rSELF_methodClassDex(a3)          #  a3 <- methodClassDex
     20     LOAD_rSELF_method(a2)                  #  a2 <- method
     21     # null obj?
     22     beqz      rOBJ, common_errNullObject   #  yes, fail
     23     LOAD_base_offObject_clazz(a0, rOBJ)      #  a0 <- thisPtr->clazz
     24     JAL(dvmFindInterfaceMethodInCache)     #  v0 <- call(class, ref, method, dex)
     25     move      a0, v0
     26     # failed?
     27     beqz      v0, common_exceptionThrown   #  yes, handle exception
     28     b         common_invokeMethod${routine} #  (a0=method, rOBJ="this")
     29