+ HashMap map = new HashMap();
+ HashSet size_added = new HashSet();
+
+ public boolean isGladiator(SootClass c) { return c.implementsInterface("edu.berkeley.cs.megacz.Gladiator"); }
+ public boolean isGladiatorField(SootField f)
+ { return isGladiator(f.getDeclaringClass()) && !f.getName().equals("this") && f.getName().indexOf('$')==-1; }
+ public SootField getGladiatorField(SootField f) {
+ SootClass c = f.getDeclaringClass();
+ SootClass oc = Scene.v().getSootClass(c.getName().substring(0, c.getName().lastIndexOf('$')));
+ if (map.get(f) != null) return (SootField)map.get(f);
+ SootField nf = new SootField(c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$" + f.getName(),
+ f.getType().makeArrayType(),
+ f.getModifiers());
+ oc.addField(nf);
+ Body body = oc.getMethod("<init>", new LinkedList()).getActiveBody();
+ Expr newArr = Jimple.v().newNewArrayExpr(f.getType(), IntConstant.v(1000));
+ Local newArrLocal = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType().makeArrayType());
+ body.getLocals().add(newArrLocal);
+ InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), nf.makeRef());
+ body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, newArrLocal));
+ body.getUnits().addFirst(Jimple.v().newAssignStmt(newArrLocal, newArr));
+ map.put(f, nf);
+ return nf;
+ }
+
+ 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) {
+ 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)));
+
+ map.put(c, f);
+ }
+ return Scene.v().makeFieldRef(mc, name, IntType.v(), false);
+ }
+
+ public boolean isGladiatorType(Type t) {
+ return (t instanceof RefType) && isGladiator(((RefType)t).getSootClass());
+ }
+