soot.JastAddJ.Block Maven / Gradle / Ivy
/* This file was generated with JastAdd2 (http://jastadd.org) version R20130212 (r1031) */
package soot.JastAddJ;
import java.util.HashSet;
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;
/**
* @production Block : {@link Stmt} ::= {@link Stmt}*;
* @ast node
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/java.ast:197
*/
public class Block extends Stmt implements Cloneable, VariableScope {
/**
* @apilevel low-level
*/
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;
}
/**
* @apilevel internal
*/
public void flushCollectionCache() {
super.flushCollectionCache();
}
/**
* @apilevel internal
*/
@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;
}
/**
* @apilevel internal
*/
@SuppressWarnings({"unchecked", "cast"})
public Block copy() {
try {
Block node = (Block) clone();
node.parent = null;
if(children != null)
node.children = (ASTNode[]) children.clone();
return node;
} catch (CloneNotSupportedException e) {
throw new Error("Error: clone not supported for " +
getClass().getName());
}
}
/**
* Create a deep copy of the AST subtree at this node.
* The copy is dangling, i.e. has no parent.
* @return dangling copy of the subtree at this node
* @apilevel low-level
*/
@SuppressWarnings({"unchecked", "cast"})
public Block fullCopy() {
Block tree = (Block) copy();
if (children != null) {
for (int i = 0; i < children.length; ++i) {
ASTNode child = (ASTNode) children[i];
if(child != null) {
child = child.fullCopy();
tree.setChild(child, i);
}
}
}
return tree;
}
/**
* @ast method
* @aspect DeclareBeforeUse
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DeclareBeforeUse.jrag:21
*/
public boolean declaredBeforeUse(Variable decl, ASTNode use) {
int indexDecl = ((ASTNode)decl).varChildIndex(this);
int indexUse = use.varChildIndex(this);
return indexDecl <= indexUse;
}
/**
* @ast method
* @aspect DeclareBeforeUse
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DeclareBeforeUse.jrag:26
*/
public boolean declaredBeforeUse(Variable decl, int indexUse) {
int indexDecl = ((ASTNode)decl).varChildIndex(this);
return indexDecl <= indexUse;
}
/**
* @ast method
* @aspect PrettyPrint
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:526
*/
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("}");
}
/**
* @ast method
* @aspect Statements
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddExtensions/JimpleBackend/Statements.jrag:15
*/
public void jimplify2(Body b) {
for(int i = 0; i < getNumStmt(); i++)
getStmt(i).jimplify2(b);
}
/**
* @ast method
*
*/
public Block() {
super();
}
/**
* Initializes the child array to the correct size.
* Initializes List and Opt nta children.
* @apilevel internal
* @ast method
* @ast method
*
*/
public void init$Children() {
children = new ASTNode[1];
setChild(new List(), 0);
}
/**
* @ast method
*
*/
public Block(List p0) {
setChild(p0, 0);
}
/**
* @apilevel low-level
* @ast method
*
*/
protected int numChildren() {
return 1;
}
/**
* @apilevel internal
* @ast method
*
*/
public boolean mayHaveRewrite() {
return false;
}
/**
* Replaces the Stmt list.
* @param list The new list node to be used as the Stmt list.
* @apilevel high-level
* @ast method
*
*/
public void setStmtList(List list) {
setChild(list, 0);
}
/**
* Retrieves the number of children in the Stmt list.
* @return Number of children in the Stmt list.
* @apilevel high-level
* @ast method
*
*/
public int getNumStmt() {
return getStmtList().getNumChild();
}
/**
* Retrieves the number of children in the Stmt list.
* Calling this method will not trigger rewrites..
* @return Number of children in the Stmt list.
* @apilevel low-level
* @ast method
*
*/
public int getNumStmtNoTransform() {
return getStmtListNoTransform().getNumChildNoTransform();
}
/**
* Retrieves the element at index {@code i} in the Stmt list..
* @param i Index of the element to return.
* @return The element at position {@code i} in the Stmt list.
* @apilevel high-level
* @ast method
*
*/
@SuppressWarnings({"unchecked", "cast"})
public Stmt getStmt(int i) {
return (Stmt)getStmtList().getChild(i);
}
/**
* Append an element to the Stmt list.
* @param node The element to append to the Stmt list.
* @apilevel high-level
* @ast method
*
*/
public void addStmt(Stmt node) {
List list = (parent == null || state == null) ? getStmtListNoTransform() : getStmtList();
list.addChild(node);
}
/**
* @apilevel low-level
* @ast method
*
*/
public void addStmtNoTransform(Stmt node) {
List list = getStmtListNoTransform();
list.addChild(node);
}
/**
* Replaces the Stmt list element at index {@code i} with the new node {@code node}.
* @param node The new node to replace the old list element.
* @param i The list index of the node to be replaced.
* @apilevel high-level
* @ast method
*
*/
public void setStmt(Stmt node, int i) {
List list = getStmtList();
list.setChild(node, i);
}
/**
* Retrieves the Stmt list.
* @return The node representing the Stmt list.
* @apilevel high-level
* @ast method
*
*/
public List getStmts() {
return getStmtList();
}
/**
* Retrieves the Stmt list.
* This method does not invoke AST transformations.
* @return The node representing the Stmt list.
* @apilevel low-level
* @ast method
*
*/
public List getStmtsNoTransform() {
return getStmtListNoTransform();
}
/**
* Retrieves the Stmt list.
* @return The node representing the Stmt list.
* @apilevel high-level
* @ast method
*
*/
@SuppressWarnings({"unchecked", "cast"})
public List getStmtList() {
List list = (List)getChild(0);
list.getNumChild();
return list;
}
/**
* Retrieves the Stmt list.
* This method does not invoke AST transformations.
* @return The node representing the Stmt list.
* @apilevel low-level
* @ast method
*
*/
@SuppressWarnings({"unchecked", "cast"})
public List getStmtListNoTransform() {
return (List)getChildNoTransform(0);
}
protected java.util.Map checkReturnDA_Variable_values;
/**
* @attribute syn
* @aspect DA
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:300
*/
@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;
}
/**
* @apilevel internal
*/
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;
}
protected java.util.Map isDAafter_Variable_values;
/**
* @attribute syn
* @aspect DA
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:441
*/
@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;
}
/**
* @apilevel internal
*/
private boolean isDAafter_compute(Variable v) { return getNumStmt() == 0 ? isDAbefore(v) : getStmt(getNumStmt()-1).isDAafter(v); }
/**
* @attribute syn
* @aspect DA
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:447
*/
public boolean isDUeverywhere(Variable v) {
ASTNode$State state = state();
try { return isDUbefore(v) && checkDUeverywhere(v); }
finally {
}
}
protected java.util.Map checkReturnDU_Variable_values;
/**
* @attribute syn
* @aspect DU
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:757
*/
@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;
}
/**
* @apilevel internal
*/
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;
}
protected java.util.Map isDUafter_Variable_values;
/**
* @attribute syn
* @aspect DU
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:870
*/
@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;
}
/**
* @apilevel internal
*/
private boolean isDUafter_compute(Variable v) { return getNumStmt() == 0 ? isDUbefore(v) : getStmt(getNumStmt()-1).isDUafter(v); }
protected java.util.Map localVariableDeclaration_String_values;
/**
* @attribute syn
* @aspect VariableScope
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/LookupVariable.jrag:116
*/
@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;
}
/**
* @apilevel internal
*/
private VariableDeclaration localVariableDeclaration_compute(String name) {
for(int i = 0; i < getNumStmt(); i++)
if(getStmt(i).declaresVariable(name))
return (VariableDeclaration)getStmt(i);
return null;
}
/**
* @attribute syn
* @aspect PrettyPrint
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:758
*/
public boolean addsIndentationLevel() {
ASTNode$State state = state();
try { return shouldHaveIndent(); }
finally {
}
}
/**
* @attribute syn
* @aspect PrettyPrint
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:765
*/
public boolean shouldHaveIndent() {
ASTNode$State state = state();
try { return getParent() instanceof List && getParent().getParent() instanceof Block; }
finally {
}
}
/**
* @apilevel internal
*/
protected boolean canCompleteNormally_computed = false;
/**
* @apilevel internal
*/
protected boolean canCompleteNormally_value;
/**
* @attribute syn
* @aspect UnreachableStatements
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag: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;
}
/**
* @apilevel internal
*/
private boolean canCompleteNormally_compute() { return getNumStmt() == 0 ? reachable() : getStmt(getNumStmt() - 1).canCompleteNormally(); }
/**
* @attribute syn
* @aspect PreciseRethrow
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java7Frontend/PreciseRethrow.jrag:55
*/
public boolean modifiedInScope(Variable var) {
ASTNode$State state = state();
try {
for (Stmt stmt : getStmtList())
if (stmt.modifiedInScope(var))
return true;
return false;
}
finally {
}
}
protected java.util.Map lookupType_String_values;
/**
* @attribute inh
* @aspect TypeScopePropagation
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/LookupType.jrag:263
*/
@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;
/**
* @attribute inh
* @aspect VariableScope
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/LookupVariable.jrag: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;
}
/**
* @attribute inh
* @aspect UnreachableStatements
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag:28
*/
@SuppressWarnings({"unchecked", "cast"})
public boolean reachable() {
ASTNode$State state = state();
boolean reachable_value = getParent().Define_boolean_reachable(this, null);
return reachable_value;
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:52
* @apilevel internal
*/
public boolean Define_boolean_isIncOrDec(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return false;
}
else { return getParent().Define_boolean_isIncOrDec(this, caller);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:444
* @apilevel internal
*/
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);
}
else { return getParent().Define_boolean_isDAbefore(this, caller, v);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:871
* @apilevel internal
*/
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);
}
else { return getParent().Define_boolean_isDUbefore(this, caller, v);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/LookupType.jrag:380
* @apilevel internal
*/
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);
}
}
else { return getParent().Define_SimpleSet_lookupType(this, caller, name);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/LookupVariable.jrag:68
* @apilevel internal
*/
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);
}
}
else { return getParent().Define_SimpleSet_lookupVariable(this, caller, name);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/NameCheck.jrag:296
* @apilevel internal
*/
public VariableScope Define_VariableScope_outerScope(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return this;
}
else { return getParent().Define_VariableScope_outerScope(this, caller);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/SyntacticClassification.jrag:116
* @apilevel internal
*/
public NameType Define_NameType_nameType(ASTNode caller, ASTNode child) {
if(caller == getStmtListNoTransform()) {
int childIndex = caller.getIndexOfChild(child);
return NameType.EXPRESSION_NAME;
}
else { return getParent().Define_NameType_nameType(this, caller);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag:38
* @apilevel internal
*/
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();
}
else { return getParent().Define_boolean_reachable(this, caller);
}
}
/**
* @declaredat /Users/eric/Documents/workspaces/clara-soot/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag:148
* @apilevel internal
*/
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();
}
else { return getParent().Define_boolean_reportUnreachable(this, caller);
}
}
/**
* @apilevel internal
*/
public ASTNode rewriteTo() {
return super.rewriteTo();
}
}