• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%verify "executed"
2%verify "unknown method"
3    /*
4     * Handle a "super" method call.
5    */
6    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
7    FETCH(t0, 4)                           # t0<- CCCC
8    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
9    FETCH(a0, 1)                           # a0<- aaaa (lo)
10    FETCH(a1, 2)                           # a1<- AAAA (hi)
11    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
12    sll       a1,a1,16
13    or        a1, a0, a1                   # a1<- AAAAaaaa
14    GET_VREG(rOBJ, t0)                     #  rOBJ <- "this" ptr
15    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
16    # null "this"?
17    LOAD_rSELF_method(t1)                  #  t1 <- current method
18    beqz      rOBJ, common_errNullObject   #  null "this", throw exception
19    # cmp a0, 0; already resolved?
20    LOAD_base_offMethod_clazz(rBIX, t1)    #  rBIX <- method->clazz
21    EXPORT_PC()                            #  must export for invoke
22    bnez      a0, .L${opcode}_continue     #  resolved, continue on
23
24    move      a0, rBIX                     #  a0 <- method->clazz
25    li        a2, METHOD_VIRTUAL           #  resolver method type
26    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
27    move      a0, v0
28    # got null?
29    beqz      v0, common_exceptionThrown   #  yes, handle exception
30    b         .L${opcode}_continue
31%break
32
33    /*
34     * At this point:
35     *  a0 = resolved base method
36     *  rBIX = method->clazz
37     */
38.L${opcode}_continue:
39    LOAD_base_offClassObject_super(a1, rBIX) #  a1 <- method->clazz->super
40    LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
41    LOAD_base_offClassObject_vtableCount(a3, a1) #  a3 <- super->vtableCount
42    EXPORT_PC()                            #  must export for invoke
43    # compare (methodIndex, vtableCount)
44    bgeu      a2, a3, .L${opcode}_nsm      #  method not present in superclass
45    LOAD_base_offClassObject_vtable(a1, a1) #  a1 <- ...clazz->super->vtable
46    LOAD_eas2(a0, a1, a2)                  #  a0 <- vtable[methodIndex]
47    b         common_invokeMethodJumbo     #  a0=method rOBJ="this"
48
49    /*
50     * Throw a NoSuchMethodError with the method name as the message.
51     *  a0 = resolved base method
52     */
53.L${opcode}_nsm:
54    LOAD_base_offMethod_name(a1, a0)       #  a1 <- method name
55    b         common_errNoSuchMethod
56
57