• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%default { "isrange":"0", "routine":"NoRange" }
2%verify "executed"
3%verify "unknown method"
4    /*
5     * Handle an optimized "super" method call.
6     *
7     * for: [opt] invoke-super-quick, invoke-super-quick/range
8     */
9    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
10    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
11    GET_GLUE(%ecx)
12    movzwl    4(rPC),%eax               # eax<- GFED or CCCC
13    movl      offGlue_method(%ecx),%ecx # ecx<- current method
14    .if       (!$isrange)
15    andl      $$0xf,%eax                # eax<- D (or stays CCCC)
16    .endif
17    movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
18    GET_VREG(%eax,%eax)                 # eax<- "this"
19    movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
20    testl     %eax,%eax                 # null "this"?
21    je        common_errNullObject      # "this" is null, throw exception
22    movzwl    2(rPC),%eax               # eax<- BBBB
23    movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
24    EXPORT_PC()
25    movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
26    jmp       common_invokeMethod${routine}
27