%verify "executed" %verify "field already resolved" %verify "field not yet resolved" %verify "field cannot be resolved" /* * General 32-bit SGET handler. * * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short */ /* op vAA, field@BBBB */ movl rSELF,%ecx movzwl 2(rPC),%eax # eax<- field ref BBBB movl offThread_methodClassDex(%ecx),%ecx # ecx<- DvmDex movl offDvmDex_pResFields(%ecx),%ecx # ecx<- dvmDex->pResFields #if defined(WITH_JIT) movl %ecx, TMP_SPILL1(%ebp) lea (%ecx,%eax,4),%ecx movl %ecx, TMP_SPILL2(%ebp) movl TMP_SPILL1(%ebp), %ecx #endif movl (%ecx,%eax,4),%eax # eax<- resolved StaticField ptr testl %eax,%eax # resolved entry null? je .L${opcode}_resolve # if not, make it so .L${opcode}_finish: # field ptr in eax movl offStaticField_value(%eax),%eax FETCH_INST_OPCODE 2 %ecx ADVANCE_PC 2 SET_VREG %eax rINST GOTO_NEXT_R %ecx /* * Go resolve the field */ .L${opcode}_resolve: movl rSELF,%ecx movzwl 2(rPC),%eax # eax<- field ref BBBB movl offThread_method(%ecx),%ecx # ecx<- current method EXPORT_PC # could throw, need to export movl offMethod_clazz(%ecx),%ecx # ecx<- method->clazz movl %eax,OUT_ARG1(%esp) movl %ecx,OUT_ARG0(%esp) SPILL(rIBASE) call dvmResolveStaticField # eax<- resolved StaticField ptr UNSPILL(rIBASE) testl %eax,%eax je common_exceptionThrown # no, handle exception #if defined(WITH_JIT) movl TMP_SPILL2(%ebp), %ecx SPILL(rIBASE) call common_verifyField UNSPILL(rIBASE) #endif jmp .L${opcode}_finish # success, continue