• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%verify "executed"
2%verify "unknown method"
3    /*
4     * Handle a jumbo "super" method call.
5     */
6    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
7    movl      rSELF,rINST
8    movl      2(rPC),%eax               # eax<- AAAAAAAA
9    movl      offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex
10    EXPORT_PC
11    movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
12    movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
13    movl      offThread_method(rINST),%eax # eax<- method
14    movzwl    8(rPC),rINST              # rINST<- CCCC
15    GET_VREG_R  rINST rINST             # rINST<- "this" ptr
16    testl     rINST,rINST               # null "this"?
17    je        common_errNullObject      # yes, throw
18    movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
19    testl     %ecx,%ecx                 # already resolved?
20    je       .L${opcode}_resolve
21    /*
22     * At this point:
23     *  ecx = resolved base method [r0]
24     *  eax = method->clazz [r9]
25     */
26.L${opcode}_continue:
27    movl    offClassObject_super(%eax),%eax   # eax<- method->clazz->super
28    movzwl  offMethod_methodIndex(%ecx),%ecx  # ecx<- baseMthod->methodIndex
29    cmpl    offClassObject_vtableCount(%eax),%ecx # compare(methodIndex,vtableCount)
30    jae     .L${opcode}_nsm           # method not present in superclass
31    movl    offClassObject_vtable(%eax),%eax   # eax<- ...clazz->super->vtable
32    movl    (%eax,%ecx,4),%eax        # eax<- vtable[methodIndex]
33    jmp     common_invokeMethodJumbo
34
35
36    /* At this point:
37     * ecx = null (needs to be resolved base method)
38     * eax = method->clazz
39    */
40.L${opcode}_resolve:
41    SPILL_TMP1(%eax)                    # method->clazz
42    movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
43    movl    2(rPC),%ecx                 # ecx<- AAAAAAAA
44    movl    $$METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
45    movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
46    call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
47    testl   %eax,%eax                   # got null?
48    movl    %eax,%ecx                   # ecx<- resolved base method
49    UNSPILL_TMP1(%eax)                  # restore method->clazz
50    jne     .L${opcode}_continue        # good to go - continue
51    jmp     common_exceptionThrown      # handle exception
52
53    /*
54     * Throw a NoSuchMethodError with the method name as the message.
55     *  ecx = resolved base method
56     */
57.L${opcode}_nsm:
58    movl    offMethod_name(%ecx),%eax
59    jmp     common_errNoSuchMethod
60