/* Soot - a J*va Optimization Framework
* Copyright (C) 2003 Jerome Miecznikowski
*
* 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.
*/
/*
Nomair A. Naeem 08-FEB-2005
This analysis class has become obselete.
Use soot.dava.toolkits.base.AST.analysis which provides a Visitor Design
Pattern
*/
package soot.dava.toolkits.base.AST;
import soot.*;
import soot.jimple.*;
public class ASTWalker
{
public ASTWalker( Singletons.Global g ) {}
public static ASTWalker v() { return G.v().soot_dava_toolkits_base_AST_ASTWalker(); }
public void walk_stmt( ASTAnalysis a, Stmt s)
{
if (a.getAnalysisDepth() < ASTAnalysis.ANALYSE_STMTS)
return;
if (s instanceof DefinitionStmt) {
DefinitionStmt ds = (DefinitionStmt) s;
walk_value( a, ds.getRightOp());
walk_value( a, ds.getLeftOp());
a.analyseDefinitionStmt( ds);
}
else if (s instanceof ReturnStmt) {
ReturnStmt rs = (ReturnStmt) s;
walk_value( a, rs.getOp());
a.analyseReturnStmt( rs);
}
else if (s instanceof InvokeStmt) {
InvokeStmt is = (InvokeStmt) s;
walk_value( a, is.getInvokeExpr());
a.analyseInvokeStmt( is);
}
else if (s instanceof ThrowStmt) {
ThrowStmt ts = (ThrowStmt) s;
walk_value( a, ts.getOp());
a.analyseThrowStmt( ts);
}
else
a.analyseStmt( s);
}
public void walk_value( ASTAnalysis a, Value v)
{
if (a.getAnalysisDepth() < ASTAnalysis.ANALYSE_VALUES)
return;
if (v instanceof Expr) {
Expr e = (Expr) v;
if (e instanceof BinopExpr) {
BinopExpr be = (BinopExpr) e;
walk_value( a, be.getOp1());
walk_value( a, be.getOp2());
a.analyseBinopExpr( be);
}
else if (e instanceof UnopExpr) {
UnopExpr ue = (UnopExpr) e;
walk_value( a, ue.getOp());
a.analyseUnopExpr( ue);
}
else if (e instanceof CastExpr) {
CastExpr ce = (CastExpr)e;
walk_value(a, ce.getOp());
a.analyseExpr(ce);
}
else if (e instanceof NewArrayExpr) {
NewArrayExpr nae = (NewArrayExpr) e;
walk_value( a, nae.getSize());
a.analyseNewArrayExpr( nae);
}
else if (e instanceof NewMultiArrayExpr) {
NewMultiArrayExpr nmae = (NewMultiArrayExpr) e;
for (int i=0; i<nmae.getSizeCount(); i++)
walk_value( a, nmae.getSize( i));
a.analyseNewMultiArrayExpr( nmae);
}
else if (e instanceof InstanceOfExpr) {
InstanceOfExpr ioe = (InstanceOfExpr) e;
walk_value( a, ioe.getOp());
a.analyseInstanceOfExpr( ioe);
}
else if (e instanceof InvokeExpr) {
InvokeExpr ie = (InvokeExpr) e;
for (int i=0; i<ie.getArgCount(); i++)
walk_value( a, ie.getArg( i));
if (ie instanceof InstanceInvokeExpr) {
InstanceInvokeExpr iie = (InstanceInvokeExpr) ie;
walk_value( a, iie.getBase());
a.analyseInstanceInvokeExpr( iie);
}
else
a.analyseInvokeExpr( ie);
}
else
a.analyseExpr( e);
}
else if (v instanceof Ref) {
Ref r = (Ref) v;
if (r instanceof ArrayRef) {
ArrayRef ar = (ArrayRef) r;
walk_value( a, ar.getBase());
walk_value( a, ar.getIndex());
a.analyseArrayRef( ar);
}
else if (r instanceof InstanceFieldRef) {
InstanceFieldRef ifr = (InstanceFieldRef) r;
walk_value( a, ifr.getBase());
a.analyseInstanceFieldRef( ifr);
}
else
a.analyseRef( r);
}
else
a.analyseValue( v);
}
}