public void finishClone() {
   List<String> cloned = m_classRemapping.getCloned();
   for (String cls : cloned) {
     run(cls, true);
   }
   fixFields();
 }
 public ClassRemappingTransform(boolean map_runtime) {
   m_classRemapping = new ClassRemapping();
   if (!map_runtime) {
     m_classRemapping.loadMap();
   }
   m_fieldsToFix = new HashMap<SootField, List<FieldRef>>();
   m_modified = new HashSet<String>();
   m_addedMethods = new ArrayList<SootMethod>();
 }
 private boolean shouldMap(SootClass soot_class) {
   if (m_classRemapping.containsKey(soot_class.getName())) {
     String curr_class = m_currMethod.getDeclaringClass().toString();
     if (m_modified.contains(curr_class) == false) {
       m_modified.add(curr_class);
     }
     return true;
   } else {
     return false;
   }
 }
 private void visit(SootMethod method) {
   SootClass soot_class = method.getDeclaringClass();
   if (m_classRemapping.containsKey(soot_class.getName())) {
     return;
   }
   if (method.isConcrete() == false) {
     return;
   }
   Body body = method.retrieveActiveBody();
   if (body == null) return;
   m_currMethod = method;
   fixArguments(method);
   Iterator<Unit> iter = body.getUnits().iterator();
   while (iter.hasNext()) {
     Unit curr = iter.next();
     List<ValueBox> boxes = curr.getUseAndDefBoxes();
     for (ValueBox box : boxes) {
       Value value = box.getValue();
       value = mutate(value);
       box.setValue(value);
     }
   }
 }
 public Set<String> getModifiedClasses() {
   Set<String> ret = new HashSet<String>();
   ret.addAll(m_modified);
   ret.addAll(m_classRemapping.getValues());
   return ret;
 }
 public List<Type> getAddedTypes() {
   return m_classRemapping.getAddedTypes();
 }
 private SootClass getMapping(SootClass soot_class) {
   String new_class = m_classRemapping.get(soot_class.getName());
   return Scene.v().getSootClass(new_class);
 }