| %verify "executed" |
| %verify "String already resolved" |
| %verify "String not yet resolved" |
| %verify "String cannot be resolved" |
| # const/string vAA, String /* BBBBBBBB */ |
| FETCH(a0, 1) # a0 <- bbbb (low) |
| FETCH(a1, 2) # a1 <- BBBB (high) |
| LOAD_rSELF_methodClassDex(a2) # a2 <- self->methodClassDex |
| GET_OPA(rOBJ) # rOBJ <- AA |
| LOAD_base_offDvmDex_pResStrings(a2, a2) # a2 <- dvmDex->pResStrings |
| sll a1, a1, 16 |
| or a1, a1, a0 # a1 <- BBBBbbbb |
| LOAD_eas2(v0, a2, a1) # v0 <- pResStrings[BBBB] |
| bnez v0, .L${opcode}_resolve |
| |
| /* |
| * Continuation if the String has not yet been resolved. |
| * a1: BBBBBBBB (String ref) |
| * rOBJ: target register |
| */ |
| EXPORT_PC() |
| LOAD_rSELF_method(a0) # a0 <- self->method |
| LOAD_base_offMethod_clazz(a0, a0) # a0 <- method->clazz |
| JAL(dvmResolveString) # v0 <- String reference |
| # failed? |
| beqz v0, common_exceptionThrown # yup, handle the exception |
| |
| .L${opcode}_resolve: |
| FETCH_ADVANCE_INST(3) # advance rPC, load rINST |
| GET_INST_OPCODE(t1) # extract opcode from rINST |
| SET_VREG_GOTO(v0, rOBJ, t1) # vAA <- v0 |
| |