189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%default { "isrange":"0", "routine":"NoRange" } 289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%verify "executed" 389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project%verify "unknown method" 489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* 589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Handle a "super" method call. 689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * 789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * for: invoke-super, invoke-super/range 889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */ 989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 119f601a917c8878204482c37aec7005054b6776fabuzbee movl rSELF,rINST 1289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movzwl 2(rPC),%eax # eax<- BBBB 139f601a917c8878204482c37aec7005054b6776fabuzbee movl offThread_methodClassDex(rINST),%ecx # ecx<- pDvmDex 14f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee EXPORT_PC 1589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods 1689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl (%ecx,%eax,4),%ecx # ecx<- resolved baseMethod 179f601a917c8878204482c37aec7005054b6776fabuzbee movl offThread_method(rINST),%eax # eax<- method 18f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzwl 4(rPC),rINST # rINST<- GFED or CCCC 1989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project .if (!$isrange) 20f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee andl $$0xf,rINST # rINST<- D (or stays CCCC) 2189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project .endif 220c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen GET_VREG_R %edx rINST # %edx<- "this" ptr 230c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen testl %edx,%edx # null "this"? 240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen SPILL_TMP1(%edx) 2589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project je common_errNullObject # yes, throw 2689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl offMethod_clazz(%eax),%eax # eax<- method->clazz 2789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project testl %ecx,%ecx # already resolved? 28a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee je .L${opcode}_resolve 2989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* 3089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * At this point: 3189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * ecx = resolved base method [r0] 3289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * eax = method->clazz [r9] 3389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */ 3489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_continue: 3589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl offClassObject_super(%eax),%eax # eax<- method->clazz->super 360c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movzwl offMethod_methodIndex(%ecx),%edx # edx<- baseMthod->methodIndex 370c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen cmpl offClassObject_vtableCount(%eax),%edx # compare(methodIndex,vtableCount) 3889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project jae .L${opcode}_nsm # method not present in superclass 3989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl offClassObject_vtable(%eax),%eax # eax<- ...clazz->super->vtable 400c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl (%eax,%edx,4),%eax # eax<- vtable[methodIndex] 410c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen UNSPILL_TMP1(%edx) 420c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl %edx, %ecx 43c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch jmp common_invokeMethod${routine} 44c4080f6bdeda19901a508cc75f96ac7e07903918Johnnie Birch 4589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project 4689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* At this point: 4789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * ecx = null (needs to be resolved base method) 4889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * eax = method->clazz 4989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */ 5089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_resolve: 510c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen SPILL_TMP2(%eax) # method->clazz 5289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl %eax,OUT_ARG0(%esp) # arg0<- method->clazz 5389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movzwl 2(rPC),%ecx # ecx<- BBBB 5489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl $$METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- resolver method type 5589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl %ecx,OUT_ARG1(%esp) # arg1<- ref 5689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project call dvmResolveMethod # eax<- call(clazz, ref, flags) 5789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project testl %eax,%eax # got null? 5889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl %eax,%ecx # ecx<- resolved base method 590c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen UNSPILL_TMP2(%eax) # restore method->clazz 6089c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project jne .L${opcode}_continue # good to go - continue 6189c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project jmp common_exceptionThrown # handle exception 6289c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project 6389c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project /* 6489c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * Throw a NoSuchMethodError with the method name as the message. 6589c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project * ecx = resolved base method 6689c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project */ 6789c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project.L${opcode}_nsm: 6889c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project movl offMethod_name(%ecx),%eax 6989c1feb0a69a7707b271086e749975b3f7acacf7The Android Open Source Project jmp common_errNoSuchMethod 70