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 FieldRWTagger extends BodyTransformer
 { 
     public FieldRWTaggerSingletons.Global g ) {}
     public static FieldRWTagger v() { return G.v().soot_jimple_toolkits_pointer_FieldRWTagger(); }
 
     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 optionDontTag = false;
     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 ) {
 	if( G.v(). == null ) {
 	    G.v(). = new UnionFactory() {
 		public Union newUnion() { return FullObjectSet.v(); }
 	    };
 	}
 	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 );
                 DumbPointerAnalysis.v(), Scene.v().getCallGraph() );
         sea.findNTRWSetsbody.getMethod() );
 	HashMap<ObjectRWSetstmtToReadSet = new HashMap<ObjectRWSet>();
 	HashMap<ObjectRWSetstmtToWriteSet = new HashMap<ObjectRWSet>();
 	UniqueRWSets sets = new UniqueRWSets();
	 = PhaseOptions.getBooleanoptions"dont-tag" );
	boolean justDoTotallyConservativeThing = 
	    body.getMethod().getName().equals"<clinit>" );
	forIterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) {
	    final Stmt stmt = (StmtstmtIt.next();
            if( !stmt.containsInvokeExpr() ) continue;
	    ifjustDoTotallyConservativeThing ) {
		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 ) ) );
	    }
	}
    /*
	DependenceGraph graph = new DependenceGraph();
	for( Iterator outerIt = sets.iterator(); outerIt.hasNext(); ) {
	    final RWSet outer = (RWSet) outerIt.next();
	    for( Iterator innerIt = sets.iterator(); innerIt.hasNext(); ) {
	        final RWSet inner = (RWSet) innerIt.next();
		if( inner == outer ) break;
		if( outer.hasNonEmptyIntersection( inner ) ) {
		    graph.addEdge( sets.indexOf( outer ), sets.indexOf( inner ) );
		}
	    }
	}
	if( !optionDontTag ) {
	    body.getMethod().addTag( graph );
	}
	for( Iterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) {
	    final Stmt stmt = (Stmt) stmtIt.next();
	    Object key;
	    if( optionNaive && stmt.containsInvokeExpr() ) {
		key = stmt;
	    } else {
		key = keyFor( stmt );
	    }
	    RWSet read = (RWSet) stmtToReadSet.get( key );
	    RWSet write = (RWSet) stmtToWriteSet.get( key );
	    if( read != null || write != null ) {
		DependenceTag tag = new DependenceTag();
		if( read != null && read.getCallsNative() ) {
		    tag.setCallsNative();
		    numNatives++;
		} else if( write != null && write.getCallsNative() ) {
		    tag.setCallsNative();
		    numNatives++;
		}
		tag.setRead( sets.indexOf( read ) );
		tag.setWrite( sets.indexOf( write ) );
		if( !optionDontTag ) stmt.addTag( tag );
		// The loop below is just fro 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