works great
authoradam <adam@megacz.com>
Wed, 18 May 2005 06:36:32 +0000 (06:36 +0000)
committeradam <adam@megacz.com>
Wed, 18 May 2005 06:36:32 +0000 (06:36 +0000)
darcs-hash:20050518063632-5007d-fb8f4e8acc3df6313f178baaa371d486857382dc.gz

src/org/ibex/arenaj/Main.java

index cde945a..a18e9aa 100644 (file)
@@ -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;
                         }