Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /* Soot - a J*va Optimization Framework
  * Copyright (C) 2004 Ganesh Sittampalam
  *
  * 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.annotation.nullcheck;
import soot.Body;
import soot.Value;
public class NullCheckEliminator extends BodyTransformer {
    public static class AnalysisFactory {
	    return new NullnessAnalysis(g);
	}
    }
    public NullCheckEliminator() {
	this(new AnalysisFactory());
    }
    public NullCheckEliminator(AnalysisFactory f) {
    }
    public void internalTransform(Body bodyString phaseNameMap options) {
	// really, the analysis should be able to use its own results to determine
	// that some branches are dead, but since it doesn't we just iterate.
	boolean changed;
	do {
	    changed=false;
	    
	    Chain units=body.getUnits();
	    Stmt s;
	    for(s=(Stmtunits.getFirst();s!=null;s=(Stmtunits.getSuccOf(s)) {
		if(!(s instanceof IfStmt)) continue;
		IfStmt is=(IfStmts;
		if(!(c instanceof EqExpr || c instanceof NeExpr)) continue;
		Immediate i=null;
		if(e.getOp1() instanceof NullConstanti=(Immediatee.getOp2();
		if(e.getOp2() instanceof NullConstanti=(Immediatee.getOp1();
		if(i==nullcontinue;
		boolean alwaysNull = analysis.isAlwaysNullBefore(si);
		boolean alwaysNonNull = analysis.isAlwaysNonNullBefore(si);
		int elim=0; // -1 => condition is false, 1 => condition is true
		if(alwaysNonNullelim=c instanceof EqExpr ? -1 : 1;
		if(alwaysNullelim=c instanceof EqExpr ? 1 : -1;
		Stmt newstmt=null;
		if(elim==-1) newstmt=Jimple.v().newNopStmt();
		if(elim==1) newstmt=Jimple.v().newGotoStmt(is.getTarget());
		if(newstmt!=null) {
		    units.swapWith(s,newstmt);
		    s=newstmt;
		    changed=true;
		}
	    }
while(changed);
    }
New to GrepCode? Check out our FAQ X