Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Soot - a J*va Optimization Framework
   * Copyright (C) 2003 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.jimple.toolkits.pointer;
 import soot.*;
 import java.util.*;
 import soot.jimple.*;
 
 public class SideEffectTagger extends BodyTransformer
 { 
     public SideEffectTaggerSingletons.Global g ) {}
     public static SideEffectTagger v() { return G.v().soot_jimple_toolkits_pointer_SideEffectTagger(); }
 
     public int numRWs = 0;
     public int numWRs = 0;
     public int numRRs = 0;
     public int numWWs = 0;
     public int numNatives = 0;
     public Date startTime = null;
     boolean optionNaive = false;
     private CallGraph cg;
     
     protected class UniqueRWSets {
 	protected ArrayList<RWSetl = new ArrayList<RWSet>();
 	RWSet getUniqueRWSet s ) {
 	    ifs == null ) return s;
 	    for (RWSet ret : ) {
 	        ifret.isEquivTos ) ) return ret;
 	    }
 	    .adds );
 	    return s;
 	}
 	    return .iterator();
 	}
 	short indexOfRWSet s ) {
 	    short i = 0;
 	    for (RWSet ret : ) {
 	        ifret.isEquivTos ) ) return i;
 		i++;
 	    }
 	    return -1;
 	}
     }
 
     protected void initializationStuffString phaseName ) {
         G.v(). = new UnionFactory() {
 	    //ReallyCheapRasUnion ru =  new ReallyCheapRasUnion();
 	    //public Union newUnion() { return new RasUnion(); }
 	    public Union newUnion() { return new MemoryEfficientRasUnion(); }
 	};
 
 	if == null ) {
 	     = new Date();
 	}
          = Scene.v().getCallGraph();
     }
     protected Object keyForStmt s ) {
 	ifs.containsInvokeExpr() ) {
 	    if ) throw new RuntimeException"shouldn't get here" );
             Iterator it = .edgesOutOfs );
 	    if( !it.hasNext() ) {
 	    }
             ArrayList ret = new ArrayList();
             whileit.hasNext() ) {
                 ret.addit.next() );
             }
             return ret;
 	} else {
 	    return s;
 	}
     }
     protected void internalTransform(Body bodyString phaseNameMap options)
     {
 	initializationStuffphaseName );
 	 = PhaseOptions.getBooleanoptions"naive" );
 	if( ! ) {
 	    sea.findNTRWSetsbody.getMethod() );
 	}
 	HashMap<ObjectRWSetstmtToReadSet = new HashMap<ObjectRWSet>();
	HashMap<ObjectRWSetstmtToWriteSet = new HashMap<ObjectRWSet>();
	UniqueRWSets sets = new UniqueRWSets();
	boolean justDoTotallyConservativeThing = 
	    body.getMethod().getName().equals"<clinit>" );
	forIterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) {
	    final Stmt stmt = (StmtstmtIt.next();
	    ifjustDoTotallyConservativeThing 
	    || (  && stmt.containsInvokeExpr() ) ) {
		stmtToReadSet.putstmtsets.getUniquenew FullRWSet() ) );
		stmtToWriteSet.putstmtsets.getUniquenew FullRWSet() ) );
		continue;
	    }
	    Object key = keyForstmt );
	    if( !stmtToReadSet.containsKeykey ) ) {
		stmtToReadSet.putkey,
		    sets.getUniquesea.readSetbody.getMethod(), stmt ) ) );
		stmtToWriteSet.putkey,
		    sets.getUniquesea.writeSetbody.getMethod(), stmt ) ) );
	    }
	}
	forIterator<RWSetouterIt = sets.iterator(); outerIt.hasNext(); ) {
	    final RWSet outer = outerIt.next();
	    forIterator<RWSetinnerIt = sets.iterator(); innerIt.hasNext(); ) {
	        final RWSet inner = innerIt.next();
		ifinner == outer ) break;
		ifouter.hasNonEmptyIntersectioninner ) ) {
                    //G.v().out.println( "inner set is: "+inner );
                    //G.v().out.println( "outer set is: "+outer );
		    graph.addEdgesets.indexOfouter ), sets.indexOfinner ) );
		}
	    }
	}
        body.getMethod().addTaggraph );
	forIterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) {
	    final Stmt stmt = (StmtstmtIt.next();
	    Object key;
	    if && stmt.containsInvokeExpr() ) {
		key = stmt;
	    } else {
		key = keyForstmt );
	    }
	    RWSet read = stmtToReadSet.getkey );
	    RWSet write = stmtToWriteSet.getkey );
	    ifread != null || write != null ) {
		ifread != null && read.getCallsNative() ) {
		    tag.setCallsNative();
		    ++;
else ifwrite != null && write.getCallsNative() ) {
		    tag.setCallsNative();
		    ++;
		}
		tag.setReadsets.indexOfread ) );
		tag.setWritesets.indexOfwrite ) );
                stmt.addTagtag );
		// The loop below is just for calculating stats.
                /*
		if( !justDoTotallyConservativeThing ) {
		    for( Iterator innerIt = body.getUnits().iterator(); innerIt.hasNext(); ) {
		        final Stmt inner = (Stmt) innerIt.next();
			Object ikey;
			if( optionNaive && inner.containsInvokeExpr() ) {
			    ikey = inner;
			} else {
			    ikey = keyFor( inner );
			}
			RWSet innerRead = (RWSet) stmtToReadSet.get( ikey );
			RWSet innerWrite = (RWSet) stmtToWriteSet.get( ikey );
			if( graph.areAdjacent( sets.indexOf( read ),
				    sets.indexOf( innerWrite ) ) ) numRWs++;
			if( graph.areAdjacent( sets.indexOf( write ),
				    sets.indexOf( innerRead ) ) ) numWRs++;
			if( inner == stmt ) continue;
			if( graph.areAdjacent( sets.indexOf( write ),
				    sets.indexOf( innerWrite ) ) ) numWWs++;
			if( graph.areAdjacent( sets.indexOf( read ),
				    sets.indexOf( innerRead ) ) ) numRRs++;
		    }
		}
                */
	    }
	}
    }
New to GrepCode? Check out our FAQ X