1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
%verify "String already resolved"
%verify "String not yet resolved"
%verify "String cannot be resolved"
/* const/string vAA, String@BBBBBBBB */
GET_GLUE(%ecx)
movl 2(rPC),%eax # eax<- BBBBBBBB
movl offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
movzbl rINST_HI,rINST_FULL # rINST_FULL<- AA
movl offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
movl (%ecx,%eax,4),%eax # eax<- rResString[BBBB]
movl rINST_FULL,%ecx
FETCH_INST_WORD(3)
testl %eax,%eax # resolved yet?
je .L${opcode}_resolve
SET_VREG(%eax,%ecx) # vAA<- rResString[BBBB]
ADVANCE_PC(3)
GOTO_NEXT
%break
/* This is the less common path, so we'll redo some work
here rather than force spills on the common path */
.L${opcode}_resolve:
GET_GLUE(%eax)
movl %ecx,rINST_FULL # rINST_FULL<- AA
EXPORT_PC()
movl offGlue_method(%eax),%eax # eax<- glue->method
movl 2(rPC),%ecx # ecx<- BBBBBBBB
movl offMethod_clazz(%eax),%eax
SPILL(rPC)
movl %ecx,OUT_ARG1(%esp)
movl %eax,OUT_ARG0(%esp)
call dvmResolveString # go resolve
UNSPILL(rPC)
testl %eax,%eax # failed?
je common_exceptionThrown
SET_VREG(%eax,rINST_FULL)
FETCH_INST_WORD(3)
ADVANCE_PC(3)
GOTO_NEXT
|