1
1
package codechicken .lib .asm ;
2
2
3
+ import static org .objectweb .asm .tree .AbstractInsnNode .*;
4
+
3
5
import com .google .common .collect .BiMap ;
4
6
import com .google .common .collect .HashBiMap ;
5
7
import com .google .common .collect .ImmutableMap ;
8
+ import java .util .*;
9
+ import java .util .Map .Entry ;
6
10
import org .objectweb .asm .tree .AbstractInsnNode ;
7
11
import org .objectweb .asm .tree .InsnList ;
8
12
import org .objectweb .asm .tree .JumpInsnNode ;
9
13
import org .objectweb .asm .tree .LabelNode ;
10
14
11
- import java .util .*;
12
- import java .util .Map .Entry ;
13
-
14
- import static org .objectweb .asm .tree .AbstractInsnNode .*;
15
-
16
- public class ASMBlock
17
- {
15
+ public class ASMBlock {
18
16
public InsnListSection list ;
19
17
private BiMap <String , LabelNode > labels ;
20
18
@@ -37,8 +35,7 @@ public ASMBlock() {
37
35
38
36
public LabelNode getOrAdd (String s ) {
39
37
LabelNode l = get (s );
40
- if (l == null )
41
- labels .put (s , l = new LabelNode ());
38
+ if (l == null ) labels .put (s , l = new LabelNode ());
42
39
return l ;
43
40
}
44
41
@@ -51,8 +48,8 @@ public void replaceLabels(Map<LabelNode, LabelNode> labelMap, Set<LabelNode> use
51
48
switch (insn .getType ()) {
52
49
case LABEL :
53
50
AbstractInsnNode insn2 = insn .clone (labelMap );
54
- if (insn2 == insn )// identity mapping
55
- continue ;
51
+ if (insn2 == insn ) // identity mapping
52
+ continue ;
56
53
if (usedLabels .contains (insn2 ))
57
54
throw new IllegalStateException ("LabelNode cannot be a part of two InsnLists" );
58
55
list .replace (insn , insn2 );
@@ -64,10 +61,9 @@ public void replaceLabels(Map<LabelNode, LabelNode> labelMap, Set<LabelNode> use
64
61
list .replace (insn , insn .clone (labelMap ));
65
62
}
66
63
67
- for (Entry <LabelNode , LabelNode > entry : labelMap .entrySet ()) {
64
+ for (Entry <LabelNode , LabelNode > entry : labelMap .entrySet ()) {
68
65
String key = labels .inverse ().get (entry .getKey ());
69
- if (key != null )
70
- labels .put (key , entry .getValue ());
66
+ if (key != null ) labels .put (key , entry .getValue ());
71
67
}
72
68
}
73
69
@@ -77,29 +73,25 @@ public void replaceLabels(Map<LabelNode, LabelNode> labelMap) {
77
73
78
74
public void replaceLabel (String s , LabelNode l ) {
79
75
LabelNode old = get (s );
80
- if (old != null )
81
- replaceLabels (ImmutableMap .of (old , l ));
76
+ if (old != null ) replaceLabels (ImmutableMap .of (old , l ));
82
77
}
83
78
84
79
/**
85
80
* Pulls all common labels from other into this
86
81
* @return this
87
82
*/
88
83
public ASMBlock mergeLabels (ASMBlock other ) {
89
- if (labels .isEmpty () || other .labels .isEmpty ())
90
- return this ;
84
+ if (labels .isEmpty () || other .labels .isEmpty ()) return this ;
91
85
92
- //common labels, give them our nodes
86
+ // common labels, give them our nodes
93
87
HashMap <LabelNode , LabelNode > labelMap = list .identityLabelMap ();
94
- for (Entry <String , LabelNode > entry : other .labels .entrySet ()) {
88
+ for (Entry <String , LabelNode > entry : other .labels .entrySet ()) {
95
89
LabelNode old = labels .get (entry .getKey ());
96
- if (old != null )
97
- labelMap .put (old , entry .getValue ());
90
+ if (old != null ) labelMap .put (old , entry .getValue ());
98
91
}
99
92
HashSet <LabelNode > usedLabels = new HashSet <LabelNode >();
100
93
for (AbstractInsnNode insn = other .list .list .getFirst (); insn != null ; insn = insn .getNext ())
101
- if (insn .getType () == LABEL )
102
- usedLabels .add ((LabelNode ) insn );
94
+ if (insn .getType () == LABEL ) usedLabels .add ((LabelNode ) insn );
103
95
104
96
replaceLabels (labelMap , usedLabels );
105
97
return this ;
@@ -118,50 +110,50 @@ public ASMBlock copy() {
118
110
BiMap <String , LabelNode > labels = HashBiMap .create ();
119
111
Map <LabelNode , LabelNode > labelMap = list .cloneLabels ();
120
112
121
- for (Entry <String , LabelNode > entry : this .labels .entrySet ())
113
+ for (Entry <String , LabelNode > entry : this .labels .entrySet ())
122
114
labels .put (entry .getKey (), labelMap .get (entry .getValue ()));
123
115
124
116
return new ASMBlock (list .copy (labelMap ), labels );
125
117
}
126
118
127
119
public ASMBlock applyLabels (InsnListSection list2 ) {
128
- if (labels .isEmpty ())
129
- return new ASMBlock (list2 );
120
+ if (labels .isEmpty ()) return new ASMBlock (list2 );
130
121
131
122
Set <LabelNode > cFlowLabels1 = labels .values ();
132
123
Set <LabelNode > cFlowLabels2 = InsnComparator .getControlFlowLabels (list2 );
133
124
ASMBlock block = new ASMBlock (list2 );
134
125
135
126
HashMap <LabelNode , LabelNode > labelMap = new HashMap <LabelNode , LabelNode >();
136
127
137
- for (int i = 0 , k = 0 ; i < list .size () && k < list2 .size (); ) {
128
+ for (int i = 0 , k = 0 ; i < list .size () && k < list2 .size (); ) {
138
129
AbstractInsnNode insn1 = list .get (i );
139
- if (!InsnComparator .insnImportant (insn1 , cFlowLabels1 )) {
130
+ if (!InsnComparator .insnImportant (insn1 , cFlowLabels1 )) {
140
131
i ++;
141
132
continue ;
142
133
}
143
134
144
135
AbstractInsnNode insn2 = list2 .get (k );
145
- if (!InsnComparator .insnImportant (insn2 , cFlowLabels2 )) {
136
+ if (!InsnComparator .insnImportant (insn2 , cFlowLabels2 )) {
146
137
k ++;
147
138
continue ;
148
139
}
149
140
150
- if (insn1 .getOpcode () != insn2 .getOpcode ())
151
- throw new IllegalArgumentException ("Lists do not match:\n " + list + "\n \n " + list2 );
141
+ if (insn1 .getOpcode () != insn2 .getOpcode ())
142
+ throw new IllegalArgumentException ("Lists do not match:\n " + list + "\n \n " + list2 );
152
143
153
- switch (insn1 .getType ()) {
144
+ switch (insn1 .getType ()) {
154
145
case LABEL :
155
146
labelMap .put ((LabelNode ) insn1 , (LabelNode ) insn2 );
156
147
break ;
157
148
case JUMP_INSN :
158
149
labelMap .put (((JumpInsnNode ) insn1 ).label , ((JumpInsnNode ) insn2 ).label );
159
150
break ;
160
151
}
161
- i ++; k ++;
152
+ i ++;
153
+ k ++;
162
154
}
163
155
164
- for (Entry <String , LabelNode > entry : labels .entrySet ())
156
+ for (Entry <String , LabelNode > entry : labels .entrySet ())
165
157
block .labels .put (entry .getKey (), labelMap .get (entry .getValue ()));
166
158
167
159
return block ;
@@ -170,4 +162,4 @@ public ASMBlock applyLabels(InsnListSection list2) {
170
162
public InsnList rawListCopy () {
171
163
return list .copy ().list ;
172
164
}
173
- }
165
+ }
0 commit comments