Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Soot - a J*va Optimization Framework
   * Copyright (C) 2004 Ondrej Lhotak
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
 package soot.toolkits.scalar;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import soot.G;
 import soot.Local;
 import soot.Timers;
 import soot.Unit;
 import soot.Value;
 import soot.ValueBox;
 import soot.util.Cons;


Analysis that provides an implementation of the LocalDefs interface.
 
 public class SmartLocalDefs implements LocalDefs
 {
     private final Map<ConsArrayList<Unit>> answer;
 
     private final Map<LocalHashSet<Unit>> localToDefs// for each local, set of units
                                    // where it's defined
     private final UnitGraph graph;
     private final LocalDefsAnalysis analysis;
     private final Map<UnitHashSetunitToMask;
     public SmartLocalDefs(UnitGraph gLiveLocals live) {
         this. = g;
 
         if(Options.v().time())
             Timers.v()..start();
         
         if(Options.v().verbose())
             G.v()..println("[" + g.getBody().getMethod().getName() +
                                "]     Constructing SmartLocalDefs...");
 
          = new HashMap<LocalHashSet<Unit>>();
          = new HashMap<UnitHashSet>();
         forIterator uIt = g.iterator(); uIt.hasNext(); ) {
             final Unit u = (UnituIt.next();
             Local l = localDef(u);
             ifl == null ) continue;
             HashSet<Units = defsOf(l);
             s.add(u);
         }
 
         if(Options.v().verbose())
             G.v()..println("[" + g.getBody().getMethod().getName() +
                                "]        done localToDefs map..." );
 
         forIterator uIt = g.iterator(); uIt.hasNext(); ) {
             final Unit u = (UnituIt.next();
             .put(unew HashSet(live.getLiveLocalsAfter(u)));
         }
 
         if(Options.v().verbose())
             G.v()..println("[" + g.getBody().getMethod().getName() +
                                "]        done unitToMask map..." );
 
          = new LocalDefsAnalysis();
 
          = new HashMap<ConsArrayList<Unit>>();
         forIterator uIt = .iterator(); uIt.hasNext(); ) {
             final Unit u = (UnituIt.next();
             forIterator vbIt = u.getUseBoxes().iterator(); vbIt.hasNext(); ) {
                 final ValueBox vb = (ValueBoxvbIt.next();
                 Value v = vb.getValue();
                 if( !(v instanceof Local) ) continue;
                 HashSet analysisResult = (HashSet.getFlowBefore(u);
                 ArrayList<Unital = new ArrayList<Unit>();
                 for (Unit unit : defsOf((Local)v)) {
                     if(analysisResult.contains(unit)) al.add(unit);
                 }
                 .put(new Cons(uv), al);
            }
        }
        if(Options.v().time())
            Timers.v()..end();
	if(Options.v().verbose())
	    G.v()..println("[" + g.getBody().getMethod().getName() +
                               "]     SmartLocalDefs finished.");
    }
    private Local localDef(Unit u) {
        List defBoxes = u.getDefBoxes();
		int size = defBoxes.size();
        ifsize == 0 ) return null;
        ifsize != 1 ) throw new RuntimeException();
        ValueBox vb = (ValueBoxdefBoxes.get(0);
        Value v = vb.getValue();
        if( !(v instanceof Local) ) return null;
        return (Localv;
    }
    private HashSet<UnitdefsOfLocal l ) {
        HashSet<Unitret = .get(l);
        ifret == null ) .putlret = new HashSet<Unit>() );
        return ret;
    }
    class LocalDefsAnalysis extends ForwardFlowAnalysis {
        LocalDefsAnalysis(UnitGraph g) {
            super(g);
            doAnalysis();
        }
        protected void merge(Object inoutOObject inO) {
            HashSet inout = (HashSetinoutO;
            HashSet in = (HashSetinO;
            inout.addAll(in);
        }
        protected void merge(Object in1Object in2Object out) {
            HashSet inSet1 = (HashSetin1;
            HashSet inSet2 = (HashSetin2;
            HashSet outSet = (HashSetout;
            outSet.clear();
            outSet.addAll(inSet1);
            outSet.addAll(inSet2);
        }
        protected void flowThrough(Object inValueObject unitObject outValue) {
            Unit u = (Unitunit;
            HashSet in = (HashSetinValue;
            HashSet<Unitout = (HashSet<Unit>) outValue;
            out.clear();
            Set mask = .get(u);
            Local l = localDef(u);
			HashSet<UnitallDefUnits = null;
			if (l == null)
			{//add all units contained in mask
	            forIterator inUIt = in.iterator(); inUIt.hasNext(); ) {
	                final Unit inU = (UnitinUIt.next();
	                ifmask.contains(localDef(inU)) )
					{
						out.add(inU);
					}
	            }
			}
			else
			{//check unit whether contained in allDefUnits before add into out set.
				allDefUnits = defsOf(l);
	            forIterator inUIt = in.iterator(); inUIt.hasNext(); ) {
	                final Unit inU = (UnitinUIt.next();
    	            ifmask.contains(localDef(inU)) )
					{//only add unit not contained in allDefUnits
						if ( allDefUnits.contains(inU)){
							out.remove(inU);
else {
							out.add(inU);
						}
					}
    	        }
   	            out.removeAll(allDefUnits);
   	            if(mask.contains(l)) out.add(u);
			}
        }
    
        protected void copy(Object sourceObject dest) {
            HashSet sourceSet = (HashSetsource;
            HashSet<ObjectdestSet   = (HashSet<Object>) dest;
              
			//retain all the elements contained by sourceSet
			if (destSet.size() > 0)
				destSet.retainAll(sourceSet);
			//add the elements not contained by destSet
			if (sourceSet.size() > 0)
			{
				forIterator its = sourceSet.iterator(); its.hasNext(); ) {
					Object o = its.next();
					if (!destSet.contains(o))
					{//need add this element.
						destSet.add(o);
					}
				}
			}
        }
        protected Object newInitialFlow() {
            return new HashSet();
        }
        protected Object entryInitialFlow() {
            return new HashSet();
        }
    }
    public List<UnitgetDefsOfAt(Local lUnit s)
    {
        return .get(new Cons(sl));
    }
New to GrepCode? Check out our FAQ X