Skip to content

Commit 345dd66

Browse files
author
Eric Bodden
committed
Merge branch 'develop' of https://github.com/Sable/soot into develop
2 parents 0c61d2a + 525ce02 commit 345dd66

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

src/soot/toolkits/scalar/ConstantInitializerToTagTransformer.java

+47-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package soot.toolkits.scalar;
22

3+
import java.util.HashMap;
4+
import java.util.HashSet;
35
import java.util.Iterator;
46
import java.util.Map;
7+
import java.util.Map.Entry;
8+
import java.util.Set;
59

610
import soot.G;
711
import soot.Scene;
@@ -13,6 +17,7 @@
1317
import soot.jimple.AssignStmt;
1418
import soot.jimple.Constant;
1519
import soot.jimple.DoubleConstant;
20+
import soot.jimple.FieldRef;
1621
import soot.jimple.FloatConstant;
1722
import soot.jimple.IntConstant;
1823
import soot.jimple.LongConstant;
@@ -61,6 +66,12 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
6166
if (smInit == null)
6267
return;
6368

69+
Set<SootField> nonConstantFields = new HashSet<SootField>();
70+
Map<SootField, ConstantValueTag> newTags = new HashMap<SootField, ConstantValueTag>();
71+
72+
if (smInit.toString().equals("<com.fasterxml.jackson.core.io.NumberOutput: void <clinit>()>"))
73+
System.out.println("x");
74+
6475
for (Iterator<Unit> itU = smInit.getActiveBody().getUnits().snapshotIterator();
6576
itU.hasNext(); ) {
6677
Unit u = itU.next();
@@ -69,6 +80,9 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
6980
if (assign.getLeftOp() instanceof StaticFieldRef
7081
&& assign.getRightOp() instanceof Constant) {
7182
SootField field = ((StaticFieldRef) assign.getLeftOp()).getField();
83+
if (nonConstantFields.contains(field))
84+
continue;
85+
7286
if (field.getDeclaringClass().equals(sc)
7387
&& field.isStatic()
7488
&& field.isFinal()) {
@@ -89,22 +103,45 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
89103
}
90104
}
91105

92-
// If we don't already have a value, we assign a new one
93106
if (!found) {
94-
Tag newTag = createConstantTagFromValue((Constant) assign.getRightOp());
95-
if (newTag != null) {
96-
field.addTag(newTag);
97-
if (removeAssignments)
98-
itU.remove();
107+
// If we already have a different tag for this field,
108+
// the value is not constant and we do not associate the
109+
// tags.
110+
if (!checkConstantValue(newTags.get(field), (Constant) assign.getRightOp())) {
111+
nonConstantFields.add(field);
112+
newTags.remove(field);
113+
continue;
99114
}
115+
116+
ConstantValueTag newTag = createConstantTagFromValue((Constant) assign.getRightOp());
117+
if (newTag != null)
118+
newTags.put(field, newTag);
100119
}
101120
}
102121
}
103122
}
104123
}
124+
125+
// Do the actual assignment
126+
for (Entry<SootField, ConstantValueTag> entry : newTags.entrySet()) {
127+
SootField field = entry.getKey();
128+
field.addTag(entry.getValue());
129+
}
130+
131+
if (removeAssignments && !newTags.isEmpty())
132+
for (Iterator<Unit> itU = smInit.getActiveBody().getUnits().snapshotIterator();
133+
itU.hasNext(); ) {
134+
Unit u = itU.next();
135+
if (u instanceof AssignStmt) {
136+
AssignStmt assign = (AssignStmt) u;
137+
if (assign.getLeftOp() instanceof FieldRef)
138+
if (newTags.containsKey(((FieldRef) assign.getLeftOp()).getField()))
139+
itU.remove();
140+
}
141+
}
105142
}
106143

107-
private Tag createConstantTagFromValue(Constant rightOp) {
144+
private ConstantValueTag createConstantTagFromValue(Constant rightOp) {
108145
if (rightOp instanceof DoubleConstant)
109146
return new DoubleConstantValueTag(((DoubleConstant) rightOp).value);
110147
else if (rightOp instanceof FloatConstant)
@@ -120,6 +157,9 @@ else if (rightOp instanceof StringConstant)
120157
}
121158

122159
private boolean checkConstantValue(ConstantValueTag t, Constant rightOp) {
160+
if (t == null || rightOp == null)
161+
return true;
162+
123163
if (t instanceof DoubleConstantValueTag) {
124164
if (!(rightOp instanceof DoubleConstant))
125165
return false;

0 commit comments

Comments
 (0)