public class Main extends SceneTransformer {
- public static final int initialSize = 100;
+ public static final int initialSize = 10000;
private static Main instance = new Main();
private Main() { }
Local l3 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v());
body.getLocals().add(l3);
InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldSizeRef(sc));
+ InstanceFieldRef maxField = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldMaxRef(sc));
body.getUnits().add(Jimple.v().newAssignStmt(l, sfr));
body.getUnits().add(Jimple.v().newAssignStmt(l2, Jimple.v().newAddExpr(l, IntConstant.v(1))));
- InstanceFieldRef maxField = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldMaxRef(sc));
+ body.getUnits().add(Jimple.v().newAssignStmt(sfr, l2));
body.getUnits().add(Jimple.v().newAssignStmt(l3, maxField));
Stmt stmt = Jimple.v().newReturnStmt(l2);
body.getUnits().add(Jimple.v().newIfStmt(Jimple.v().newLtExpr(l2, l3), stmt));
SootClass mc = getParent(((RefType)ce.getCastType()).getSootClass());
SootClass ic = Scene.v().getSootClass("java.lang.Integer");
ce.setCastType(ic.getType());
- // FIXME deal with null
+
+ Local l1 = Jimple.v().newLocal("tmpRef" + (tfr++), ic.getType()); body.getLocals().add(l1);
+ Local l2 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); body.getLocals().add(l2);
+
+ Stmt s2 = Jimple.v().newAssignStmt(l1, Jimple.v().newCastExpr(ce.getOp(), ic.getType()));
+ body.getUnits().insertBefore(s2, s);
+
+ Stmt isNull = Jimple.v().newAssignStmt(l2, IntConstant.v(-1));
+ body.getUnits().insertAfter(isNull, s2);
+
+ Stmt ifStmt = Jimple.v().newIfStmt(Jimple.v().newEqExpr(l1, NullConstant.v()), s);
+ body.getUnits().insertAfter(ifStmt, isNull);
+
SootMethodRef mr = Scene.v().makeMethodRef(ic, "intValue", new LinkedList(), IntType.v(), false);
- InvokeExpr iie = Jimple.v().newVirtualInvokeExpr(viaLocal(ce, body, s),
- mr,
- new LinkedList());
- vb.setValue(viaLocal(iie, body, s));
- qq = 0;
+ Stmt isNotNull =
+ Jimple.v().newAssignStmt(l2, Jimple.v().newVirtualInvokeExpr(l1, mr, new LinkedList()));
+ body.getUnits().insertAfter(isNotNull, ifStmt);
+
+ vb.setValue(l2);
+ qq = 0; // ???
break;
}