public class Transformer extends SceneTransformer {
+ public static final int initialSize = 100;
+
private static Transformer instance = new Transformer();
private Transformer() {
}
0);
oc.addField(nf);
Body body = oc.getMethod("<init>", new LinkedList()).getActiveBody();
- Expr newArr = Jimple.v().newNewArrayExpr(t, IntConstant.v(100000));
+ Expr newArr = Jimple.v().newNewArrayExpr(t, IntConstant.v(initialSize));
Local newArrLocal = Jimple.v().newLocal("tmpRef" + (tfr++), f.type().makeArrayType());
body.getLocals().add(newArrLocal);
InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), nf.makeRef());
private Body body;
public SootFieldRef getGladiatorFieldSizeRef(SootClass c) {
SootClass mc = Scene.v().getMainClass();
- String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_size";
- if (map.get(c) == null) {
+ String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$size";
+ if (map.get(name) == null) {
SootField f = new SootField(name, IntType.v());
mc.addField(f);
}
public SootFieldRef getGladiatorFieldMaxRef(SootClass c) {
SootClass mc = Scene.v().getMainClass();
- String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_max";
- if (map.get(c) == null) {
+ String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$max";
+ if (map.get(name) == null) {
SootField f = new SootField(name, IntType.v());
mc.addField(f);
Body body = mc.getMethod("<init>", new LinkedList()).getActiveBody();
InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), f.makeRef());
- body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, IntConstant.v(0)));
+ body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, IntConstant.v(initialSize)));
map.put(c, f);
}
//nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.Test"));
//nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh"));
//nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh$Triangle"));
- fixClass(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench"));
+ fixClass(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench$Node"));
nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench$Node"));
nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench"));
}
method.setActiveBody(body = Jimple.v().newBody(method));
body.setMethod(method);
((JimpleBody)body).insertIdentityStmts();
- InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldSizeRef(sc));
- InstanceFieldRef maxField = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldMaxRef(sc));
Local l = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v());
body.getLocals().add(l);
Local l2 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v());
body.getLocals().add(l2);
Local l3 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v());
body.getLocals().add(l3);
+ InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldSizeRef(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(l3, maxField));
- /*
- body.getUnits().add(Jimple.v().newIfStmt(Jimple.v().newLtExpr(l2, l3),
- Jimple.v().newReturnStmt(l2)));
- */
- body.getUnits().add(Jimple.v().newReturnStmt(l2));
- body.validate();
+ Stmt stmt = Jimple.v().newReturnStmt(l2);
+ body.getUnits().add(Jimple.v().newIfStmt(Jimple.v().newLtExpr(l2, l3), stmt));
+
+ Local l4 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v());
+ body.getLocals().add(l4);
+ body.getUnits().add(Jimple.v().newAssignStmt(l4, Jimple.v().newShlExpr(l3, IntConstant.v(1))));
+ body.getUnits().add(Jimple.v().newAssignStmt(maxField, l4));
+
+ for(Iterator it = sc.getFields().iterator(); it.hasNext();) {
+ SootField f = getGladiatorField((SootField)it.next());
+ InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), f.makeRef());
+ Local ll0 = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType());
+ body.getLocals().add(ll0);
+ body.getUnits().add(Jimple.v().newAssignStmt(ll0, ifr));
+ Local ll = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType());
+ body.getLocals().add(ll);
+ body.getUnits().add(Jimple.v().newAssignStmt(ll,
+ Jimple.v().newNewArrayExpr(((ArrayType)f.getType()).getElementType(),
+ l4)));
+ Type ot = Scene.v().getSootClass("java.lang.Object").getType();
+ List types = new LinkedList();
+ types.add(ot);
+ types.add(IntType.v());
+ types.add(ot);
+ types.add(IntType.v());
+ types.add(IntType.v());
+ SootMethodRef arrayCopy =
+ Scene.v().makeMethodRef(Scene.v().getSootClass("java.lang.System"),
+ "arraycopy",
+ types,
+ VoidType.v(),
+ true);
+ List args = new LinkedList();
+ args.add(ll0);
+ args.add(IntConstant.v(0));
+ args.add(ll);
+ args.add(IntConstant.v(0));
+ args.add(l3);
+ body.getUnits().add(Jimple.v().newInvokeStmt(Jimple.v().newStaticInvokeExpr(arrayCopy, args)));
+ body.getUnits().add(Jimple.v().newAssignStmt(ifr,ll));
+ }
+
+ body.getUnits().add(stmt);
}
public void nuke(SootClass c) {
List list = new LinkedList(); list.addAll(c.getMethods());
for(Iterator it = list.iterator(); it.hasNext();) {
SootMethod m = (SootMethod)it.next();
+ if (isGladiator(c) && m.getName().equals("<init>")) continue;
if (m.hasActiveBody() && !m.isStatic()) m.setActiveBody(fixBody(m.getActiveBody()));
if (m.getName().equals("<init>")) continue;
if (m.getName().equals("<clinit>")) continue;