1 2 %verify "Class already resolved" 3 %verify "Class not yet resolved" 4 %verify "Class cannot be resolved" 5 /* const/class vAA, Class@BBBB */ 6 movl rSELF,%ecx 7 movzwl 2(rPC),%eax # eax<- BBBB 8 movl offThread_methodClassDex(%ecx),%ecx# ecx<- self->methodClassDex 9 movl offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses 10 movl (%ecx,%eax,4),%eax # eax<- rResClasses[BBBB] 11 testl %eax,%eax # resolved yet? 12 je .L${opcode}_resolve 13 FETCH_INST_OPCODE 2 %ecx 14 SET_VREG %eax rINST # vAA<- rResClasses[BBBB] 15 ADVANCE_PC 2 16 GOTO_NEXT_R %ecx 17 18 /* This is the less common path, so we'll redo some work 19 here rather than force spills on the common path */ 20 .L${opcode}_resolve: 21 movl rSELF,%eax 22 EXPORT_PC 23 movl offThread_method(%eax),%eax # eax<- self->method 24 movl $$1,OUT_ARG2(%esp) # true 25 movzwl 2(rPC),%ecx # ecx<- BBBB 26 movl offMethod_clazz(%eax),%eax 27 movl %ecx,OUT_ARG1(%esp) 28 movl %eax,OUT_ARG0(%esp) 29 SPILL(rIBASE) 30 call dvmResolveClass # go resolve 31 UNSPILL(rIBASE) 32 testl %eax,%eax # failed? 33 je common_exceptionThrown 34 FETCH_INST_OPCODE 2 %ecx 35 SET_VREG %eax rINST 36 ADVANCE_PC 2 37 GOTO_NEXT_R %ecx 38