1 %verify "executed" 2 %verify "field already resolved" 3 %verify "field not yet resolved" 4 %verify "field cannot be resolved" 5 /* 6 * Jumbo SPUT object handler. 7 */ 8 /* sput-object/jumbo vBBBB, field@AAAAAAAA */ 9 movl rSELF,%ecx 10 movl 2(rPC),%eax # eax<- field ref AAAAAAAA 11 movl offThread_methodClassDex(%ecx),%ecx # ecx<- DvmDex 12 movl offDvmDex_pResFields(%ecx),%ecx # ecx<- dvmDex->pResFields 13 movl (%ecx,%eax,4),%eax # eax<- resolved StaticField 14 testl %eax,%eax # resolved entry null? 15 je .L${opcode}_resolve # if not, make it so 16 .L${opcode}_finish: # field ptr in eax 17 GET_VREG_R %ecx rINST 18 movl %ecx,offStaticField_value(%eax) # do the store 19 testl %ecx,%ecx # stored null object ptr? 20 je 1f # skip card mark if null 21 movl rSELF,%ecx 22 movl offField_clazz(%eax),%eax # eax<- method->clazz 23 movl offThread_cardTable(%ecx),%ecx # get card table base 24 shrl $$GC_CARD_SHIFT,%eax # head to card number 25 movb %cl,(%ecx,%eax) # mark card 26 1: 27 FETCH_INST_OPCODE 4 %ecx 28 ADVANCE_PC 4 29 GOTO_NEXT_R %ecx 30 31 .L${opcode}_resolve: 32 movl rSELF,%ecx 33 movl 2(rPC),%eax # eax<- field ref AAAAAAAA 34 movl offThread_method(%ecx),%ecx # ecx<- current method 35 EXPORT_PC # could throw, need to export 36 movl offMethod_clazz(%ecx),%ecx # ecx<- method->clazz 37 movl %eax,OUT_ARG1(%esp) 38 movl %ecx,OUT_ARG0(%esp) 39 SPILL(rIBASE) 40 call dvmResolveStaticField # eax<- resolved StaticField ptr 41 UNSPILL(rIBASE) 42 testl %eax,%eax 43 jne .L${opcode}_finish # success, continue 44 jmp common_exceptionThrown # no, handle exception 45