package soot.JastAddJ;
import java.util.HashSet;import java.util.LinkedHashSet;import java.io.File;import java.util.*;import beaver.*;import java.util.ArrayList;import java.util.zip.*;import java.io.*;import java.io.FileNotFoundException;import java.util.Collection;import soot.*;import soot.util.*;import soot.jimple.*;import soot.coffi.ClassFile;import soot.coffi.method_info;import soot.coffi.CONSTANT_Utf8_info;import soot.tagkit.SourceFileTag;import soot.coffi.CoffiMethodSource;
// a statement that can be reached by break or continue
public class Block extends Stmt implements Cloneable, VariableScope {
public void flushCache() {
super.flushCache();
checkReturnDA_Variable_values = null;
isDAafter_Variable_values = null;
checkReturnDU_Variable_values = null;
isDUafter_Variable_values = null;
localVariableDeclaration_String_values = null;
canCompleteNormally_computed = false;
lookupType_String_values = null;
lookupVariable_String_values = null;
}
public void flushCollectionCache() {
super.flushCollectionCache();
}
@SuppressWarnings({"unchecked", "cast"}) public Block clone() throws CloneNotSupportedException {
Block node = (Block)super.clone();
node.checkReturnDA_Variable_values = null;
node.isDAafter_Variable_values = null;
node.checkReturnDU_Variable_values = null;
node.isDUafter_Variable_values = null;
node.localVariableDeclaration_String_values = null;
node.canCompleteNormally_computed = false;
node.lookupType_String_values = null;
node.lookupVariable_String_values = null;
node.in$Circle(false);
node.is$Final(false);
return node;
}
@SuppressWarnings({"unchecked", "cast"}) public Block copy() {
try {
Block node = (Block)clone();
if(children != null) node.children = (ASTNode[])children.clone();
return node;
} catch (CloneNotSupportedException e) {
}
System.err.println("Error: Could not clone node of type " + getClass().getName() + "!");
return null;
}
@SuppressWarnings({"unchecked", "cast"}) public Block fullCopy() {
Block res = (Block)copy();
for(int i = 0; i < getNumChildNoTransform(); i++) {
ASTNode node = getChildNoTransform(i);
if(node != null) node = node.fullCopy();
res.setChild(node, i);
}
return res;
}
// Declared in DeclareBeforeUse.jrag at line 21
public boolean declaredBeforeUse(Variable decl, ASTNode use) {
int indexDecl = ((ASTNode)decl).varChildIndex(this);
int indexUse = use.varChildIndex(this);
return indexDecl <= indexUse;
}
// Declared in DeclareBeforeUse.jrag at line 26
public boolean declaredBeforeUse(Variable decl, int indexUse) {
int indexDecl = ((ASTNode)decl).varChildIndex(this);
return indexDecl <= indexUse;
}
// Declared in PrettyPrint.jadd at line 525
// Stmts
public void toString(StringBuffer s) {
String indent = indent();
s.append(shouldHaveIndent() ? indent : "");
s.append("{");
for(int i = 0; i < getNumStmt(); i++) {
getStmt(i).toString(s);
}
s.append(shouldHaveIndent() ? indent : indent.substring(0, indent.length()-2));
s.append("}");
}
// Declared in Statements.jrag at line 15
public void jimplify2(Body b) {
for(int i = 0; i < getNumStmt(); i++)
getStmt(i).jimplify2(b);
}
// Declared in java.ast at line 3
// Declared in java.ast line 200
public Block() {
super();
setChild(new List(), 0);
}
// Declared in java.ast at line 11
// Declared in java.ast line 200
public Block(List<Stmt> p0) {
setChild(p0, 0);
}
// Declared in java.ast at line 15
protected int numChildren() {
return 1;
}
// Declared in java.ast at line 18
public boolean mayHaveRewrite() {
return false;
}
// Declared in java.ast at line 2
// Declared in java.ast line 200
public void setStmtList(List<Stmt> list) {
setChild(list, 0);
}
// Declared in java.ast at line 6
public int getNumStmt() {
return getStmtList().getNumChild();
}
// Declared in java.ast at line 10
@SuppressWarnings({"unchecked", "cast"}) public Stmt getStmt(int i) {
return (Stmt)getStmtList().getChild(i);
}
// Declared in java.ast at line 14
public void addStmt(Stmt node) {
List<Stmt> list = (parent == null || state == null) ? getStmtListNoTransform() : getStmtList();
list.addChild(node);
}
// Declared in java.ast at line 19
public void addStmtNoTransform(Stmt node) {
List<Stmt> list = getStmtListNoTransform();
list.addChild(node);
}
// Declared in java.ast at line 24
public void setStmt(Stmt node, int i) {
List<Stmt> list = getStmtList();
list.setChild(node, i);
}
// Declared in java.ast at line 28
public List<Stmt> getStmts() {
return getStmtList();
}
// Declared in java.ast at line 31
public List<Stmt> getStmtsNoTransform() {
return getStmtListNoTransform();
}
// Declared in java.ast at line 35
@SuppressWarnings({"unchecked", "cast"}) public List<Stmt> getStmtList() {
List<Stmt> list = (List<Stmt>)getChild(0);
list.getNumChild();
return list;
}
// Declared in java.ast at line 41
@SuppressWarnings({"unchecked", "cast"}) public List<Stmt> getStmtListNoTransform() {
return (List<Stmt>)getChildNoTransform(0);
}
protected java.util.Map checkReturnDA_Variable_values;
// Declared in DefiniteAssignment.jrag at line 302
@SuppressWarnings({"unchecked", "cast"}) public boolean checkReturnDA(Variable v) {
Object _parameters = v;
if(checkReturnDA_Variable_values == null) checkReturnDA_Variable_values = new java.util.HashMap(4);
if(checkReturnDA_Variable_values.containsKey(_parameters)) {
return ((Boolean)checkReturnDA_Variable_values.get(_parameters)).booleanValue();
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
boolean checkReturnDA_Variable_value = checkReturnDA_compute(v);
if(isFinal && num == state().boundariesCrossed)
checkReturnDA_Variable_values.put(_parameters, Boolean.valueOf(checkReturnDA_Variable_value));
return checkReturnDA_Variable_value;
}
private boolean checkReturnDA_compute(Variable v) {
HashSet set = new HashSet();
collectBranches(set);
for(Iterator iter = set.iterator(); iter.hasNext(); ) {
Object o = iter.next();
if(o instanceof ReturnStmt) {
ReturnStmt stmt = (ReturnStmt)o;
if(!stmt.isDAafterReachedFinallyBlocks(v))
return false;
}
}
return true;
}
// Declared in DefiniteAssignment.jrag at line 442
@SuppressWarnings({"unchecked", "cast"}) public boolean isDAafter(Variable v) {
Object _parameters = v;
if(isDAafter_Variable_values == null) isDAafter_Variable_values = new java.util.HashMap(4);
if(isDAafter_Variable_values.containsKey(_parameters)) {
return ((Boolean)isDAafter_Variable_values.get(_parameters)).booleanValue();
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
boolean isDAafter_Variable_value = isDAafter_compute(v);
if(isFinal && num == state().boundariesCrossed)
isDAafter_Variable_values.put(_parameters, Boolean.valueOf(isDAafter_Variable_value));
return isDAafter_Variable_value;
}
private boolean isDAafter_compute(Variable v) { return getNumStmt() == 0 ? isDAbefore(v) : getStmt(getNumStmt()-1).isDAafter(v); }
// Declared in DefiniteAssignment.jrag at line 448
@SuppressWarnings({"unchecked", "cast"}) public boolean isDUeverywhere(Variable v) {
ASTNode$State state = state();
boolean isDUeverywhere_Variable_value = isDUeverywhere_compute(v);
return isDUeverywhere_Variable_value;
}
private boolean isDUeverywhere_compute(Variable v) { return isDUbefore(v) && checkDUeverywhere(v); }
protected java.util.Map checkReturnDU_Variable_values;
// Declared in DefiniteAssignment.jrag at line 758
@SuppressWarnings({"unchecked", "cast"}) public boolean checkReturnDU(Variable v) {
Object _parameters = v;
if(checkReturnDU_Variable_values == null) checkReturnDU_Variable_values = new java.util.HashMap(4);
if(checkReturnDU_Variable_values.containsKey(_parameters)) {
return ((Boolean)checkReturnDU_Variable_values.get(_parameters)).booleanValue();
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
boolean checkReturnDU_Variable_value = checkReturnDU_compute(v);
if(isFinal && num == state().boundariesCrossed)
checkReturnDU_Variable_values.put(_parameters, Boolean.valueOf(checkReturnDU_Variable_value));
return checkReturnDU_Variable_value;
}
private boolean checkReturnDU_compute(Variable v) {
HashSet set = new HashSet();
collectBranches(set);
for(Iterator iter = set.iterator(); iter.hasNext(); ) {
Object o = iter.next();
if(o instanceof ReturnStmt) {
ReturnStmt stmt = (ReturnStmt)o;
if(!stmt.isDUafterReachedFinallyBlocks(v))
return false;
}
}
return true;
}
// Declared in DefiniteAssignment.jrag at line 874
@SuppressWarnings({"unchecked", "cast"}) public boolean isDUafter(Variable v) {
Object _parameters = v;
if(isDUafter_Variable_values == null) isDUafter_Variable_values = new java.util.HashMap(4);
if(isDUafter_Variable_values.containsKey(_parameters)) {
return ((Boolean)isDUafter_Variable_values.get(_parameters)).booleanValue();
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
boolean isDUafter_Variable_value = isDUafter_compute(v);
if(isFinal && num == state().boundariesCrossed)
isDUafter_Variable_values.put(_parameters, Boolean.valueOf(isDUafter_Variable_value));
return isDUafter_Variable_value;
}
private boolean isDUafter_compute(Variable v) { return getNumStmt() == 0 ? isDUbefore(v) : getStmt(getNumStmt()-1).isDUafter(v); }
protected java.util.Map localVariableDeclaration_String_values;
// Declared in LookupVariable.jrag at line 114
@SuppressWarnings({"unchecked", "cast"}) public VariableDeclaration localVariableDeclaration(String name) {
Object _parameters = name;
if(localVariableDeclaration_String_values == null) localVariableDeclaration_String_values = new java.util.HashMap(4);
if(localVariableDeclaration_String_values.containsKey(_parameters)) {
return (VariableDeclaration)localVariableDeclaration_String_values.get(_parameters);
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
VariableDeclaration localVariableDeclaration_String_value = localVariableDeclaration_compute(name);
if(isFinal && num == state().boundariesCrossed)
localVariableDeclaration_String_values.put(_parameters, localVariableDeclaration_String_value);
return localVariableDeclaration_String_value;
}
private VariableDeclaration localVariableDeclaration_compute(String name) {
for(int i = 0; i < getNumStmt(); i++)
if(getStmt(i).declaresVariable(name))
return (VariableDeclaration)getStmt(i);
return null;
}
// Declared in PrettyPrint.jadd at line 762
@SuppressWarnings({"unchecked", "cast"}) public boolean addsIndentationLevel() {
ASTNode$State state = state();
boolean addsIndentationLevel_value = addsIndentationLevel_compute();
return addsIndentationLevel_value;
}
private boolean addsIndentationLevel_compute() { return shouldHaveIndent(); }
// Declared in PrettyPrint.jadd at line 764
@SuppressWarnings({"unchecked", "cast"}) public boolean shouldHaveIndent() {
ASTNode$State state = state();
boolean shouldHaveIndent_value = shouldHaveIndent_compute();
return shouldHaveIndent_value;
}
private boolean shouldHaveIndent_compute() { return getParent() instanceof List && getParent().getParent() instanceof Block; }
// Declared in UnreachableStatements.jrag at line 37
@SuppressWarnings({"unchecked", "cast"}) public boolean canCompleteNormally() {
if(canCompleteNormally_computed) {
return canCompleteNormally_value;
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
canCompleteNormally_value = canCompleteNormally_compute();
if(isFinal && num == state().boundariesCrossed)
canCompleteNormally_computed = true;
return canCompleteNormally_value;
}
private boolean canCompleteNormally_compute() { return getNumStmt() == 0 ? reachable() : getStmt(getNumStmt() - 1).canCompleteNormally(); }
protected java.util.Map lookupType_String_values;
// Declared in LookupType.jrag at line 175
@SuppressWarnings({"unchecked", "cast"}) public SimpleSet lookupType(String name) {
Object _parameters = name;
if(lookupType_String_values == null) lookupType_String_values = new java.util.HashMap(4);
if(lookupType_String_values.containsKey(_parameters)) {
return (SimpleSet)lookupType_String_values.get(_parameters);
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
SimpleSet lookupType_String_value = getParent().Define_SimpleSet_lookupType(this, null, name);
if(isFinal && num == state().boundariesCrossed)
lookupType_String_values.put(_parameters, lookupType_String_value);
return lookupType_String_value;
}
protected java.util.Map lookupVariable_String_values;
// Declared in LookupVariable.jrag at line 17
@SuppressWarnings({"unchecked", "cast"}) public SimpleSet lookupVariable(String name) {
Object _parameters = name;
if(lookupVariable_String_values == null) lookupVariable_String_values = new java.util.HashMap(4);
if(lookupVariable_String_values.containsKey(_parameters)) {
return (SimpleSet)lookupVariable_String_values.get(_parameters);
}
ASTNode$State state = state();
int num = state.boundariesCrossed;
boolean isFinal = this.is$Final();
SimpleSet lookupVariable_String_value = getParent().Define_SimpleSet_lookupVariable(this, null, name);
if(isFinal && num == state().boundariesCrossed)
lookupVariable_String_values.put(_parameters, lookupVariable_String_value);
return lookupVariable_String_value;
}
// Declared in UnreachableStatements.jrag at line 28
@SuppressWarnings({"unchecked", "cast"}) public boolean reachable() {
ASTNode$State state = state();
boolean reachable_value = getParent().Define_boolean_reachable(this, null);
return reachable_value;
}
// Declared in DefiniteAssignment.jrag at line 52
public boolean Define_boolean_isIncOrDec(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return false;
}
return getParent().Define_boolean_isIncOrDec(this, caller);
}
// Declared in DefiniteAssignment.jrag at line 445
public boolean Define_boolean_isDAbefore(ASTNode caller, ASTNode child, Variable v) {
if(caller == getStmtListNoTransform()) {
int index = caller.getIndexOfChild(child);
return index == 0 ? isDAbefore(v) : getStmt(index - 1).isDAafter(v);
}
return getParent().Define_boolean_isDAbefore(this, caller, v);
}
// Declared in DefiniteAssignment.jrag at line 875
public boolean Define_boolean_isDUbefore(ASTNode caller, ASTNode child, Variable v) {
if(caller == getStmtListNoTransform()) {
int index = caller.getIndexOfChild(child);
return index == 0 ? isDUbefore(v) : getStmt(index - 1).isDUafter(v);
}
return getParent().Define_boolean_isDUbefore(this, caller, v);
}
// Declared in LookupType.jrag at line 292
public SimpleSet Define_SimpleSet_lookupType(ASTNode caller, ASTNode child, String name) {
if(caller == getStmtListNoTransform()) {
int index = caller.getIndexOfChild(child);
{
SimpleSet c = SimpleSet.emptySet;
for(int i = index; i >= 0 && !(getStmt(i) instanceof Case); i--) {
if(getStmt(i) instanceof LocalClassDeclStmt) {
TypeDecl t = ((LocalClassDeclStmt)getStmt(i)).getClassDecl();
if(t.name().equals(name)) {
c = c.add(t);
}
}
}
if(!c.isEmpty())
return c;
return lookupType(name);
}
}
return getParent().Define_SimpleSet_lookupType(this, caller, name);
}
// Declared in LookupVariable.jrag at line 68
public SimpleSet Define_SimpleSet_lookupVariable(ASTNode caller, ASTNode child, String name) {
if(caller == getStmtListNoTransform()) {
int index = caller.getIndexOfChild(child);
{
VariableDeclaration v = localVariableDeclaration(name);
// declare before use and shadowing
if(v != null && declaredBeforeUse(v, index))
return v;
return lookupVariable(name);
}
}
return getParent().Define_SimpleSet_lookupVariable(this, caller, name);
}
// Declared in NameCheck.jrag at line 291
public VariableScope Define_VariableScope_outerScope(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return this;
}
return getParent().Define_VariableScope_outerScope(this, caller);
}
// Declared in SyntacticClassification.jrag at line 116
public NameType Define_NameType_nameType(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return NameType.EXPRESSION_NAME;
}
return getParent().Define_NameType_nameType(this, caller);
}
// Declared in UnreachableStatements.jrag at line 38
public boolean Define_boolean_reachable(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return childIndex == 0 ? reachable() : getStmt(childIndex-1).canCompleteNormally();
}
return getParent().Define_boolean_reachable(this, caller);
}
// Declared in UnreachableStatements.jrag at line 146
public boolean Define_boolean_reportUnreachable(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int i = caller.getIndexOfChild(child);
return i == 0 ? reachable() : getStmt(i-1).reachable();
}
return getParent().Define_boolean_reportUnreachable(this, caller);
}
public ASTNode rewriteTo() {
return super.rewriteTo();
}
}