From cf1d583a7b9311a79e1cc3b3e6ddb612c8be51c7 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 18 May 2005 06:36:32 +0000 Subject: [PATCH] works great darcs-hash:20050518063632-5007d-fb8f4e8acc3df6313f178baaa371d486857382dc.gz --- src/org/ibex/arenaj/Main.java | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/org/ibex/arenaj/Main.java b/src/org/ibex/arenaj/Main.java index cde945a..a18e9aa 100644 --- a/src/org/ibex/arenaj/Main.java +++ b/src/org/ibex/arenaj/Main.java @@ -7,7 +7,7 @@ import java.util.*; 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() { } @@ -226,9 +226,10 @@ public class Main extends SceneTransformer { 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)); @@ -553,13 +554,26 @@ public class Main extends SceneTransformer { 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; } -- 1.7.10.4