+ 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);