- public boolean implementsGladiator(SootClass c) { return c.implementsInterface("org.ibex.arenaj.Gladiator"); }
- public SootField getSliceForField(SootField f) { return getSliceForField(f.makeRef()); }
- public SootField getSliceForField(SootFieldRef f) {
- SootClass c = f.declaringClass();
- SootClass oc = Scene.v().getSootClass(c.getName().substring(0, c.getName().lastIndexOf('$')));
- String sig = f.declaringClass().getName()+"."+f.name();
- if (map.get(sig) != null) return (SootField)map.get(sig);
- Type t = f.type();
- if (t instanceof RefType && implementsGladiator(((RefType)t).getSootClass())) t = IntType.v();
- SootField nf = new SootField(c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$" + f.name(),
- t.makeArrayType(),
- 0);
- oc.addField(nf);
-
- Body body = getInitBody(oc);
- 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());
- body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, newArrLocal));
- body.getUnits().addFirst(Jimple.v().newAssignStmt(newArrLocal, newArr));
-
- map.put(sig, nf);
- return nf;
- }
-
- public Body getInitBody(SootClass c) {
- c.setApplicationClass();
- List list = new LinkedList();
- SootMethod m = c.getMethod("<init>", list);
- if (!m.hasActiveBody()) {
- JimpleBody b = (JimpleBody)Jimple.v().newBody(m);
- m.setActiveBody(b);
- }
- return m.getActiveBody();
- }
-
- public boolean implementsGladiator(Type t) { return (t instanceof RefType)&&implementsGladiator(((RefType)t).getSootClass()); }