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; public class TryStmt extends Stmt implements Cloneable, FinallyHost { public void flushCache() { super.flushCache(); branches_computed = false; branches_value = null; branchesFromFinally_computed = false; branchesFromFinally_value = null; targetBranches_computed = false; targetBranches_value = null; escapedBranches_computed = false; escapedBranches_value = null; isDAafter_Variable_values = null; isDUbefore_Variable_values = null; isDUafter_Variable_values = null; reachableThrow_CatchClause_values = null; canCompleteNormally_computed = false; label_begin_computed = false; label_begin_value = null; label_block_end_computed = false; label_block_end_value = null; label_end_computed = false; label_end_value = null; label_finally_computed = false; label_finally_value = null; label_finally_block_computed = false; label_finally_block_value = null; label_exception_handler_computed = false; label_exception_handler_value = null; label_catch_end_computed = false; label_catch_end_value = null; exceptionRanges_computed = false; exceptionRanges_value = null; handlesException_TypeDecl_values = null; typeError_computed = false; typeError_value = null; typeRuntimeException_computed = false; typeRuntimeException_value = null; } public void flushCollectionCache() { super.flushCollectionCache(); } @SuppressWarnings({"unchecked", "cast"}) public TryStmt clone() throws CloneNotSupportedException { TryStmt node = (TryStmt)super.clone(); node.branches_computed = false; node.branches_value = null; node.branchesFromFinally_computed = false; node.branchesFromFinally_value = null; node.targetBranches_computed = false; node.targetBranches_value = null; node.escapedBranches_computed = false; node.escapedBranches_value = null; node.isDAafter_Variable_values = null; node.isDUbefore_Variable_values = null; node.isDUafter_Variable_values = null; node.reachableThrow_CatchClause_values = null; node.canCompleteNormally_computed = false; node.label_begin_computed = false; node.label_begin_value = null; node.label_block_end_computed = false; node.label_block_end_value = null; node.label_end_computed = false; node.label_end_value = null; node.label_finally_computed = false; node.label_finally_value = null; node.label_finally_block_computed = false; node.label_finally_block_value = null; node.label_exception_handler_computed = false; node.label_exception_handler_value = null; node.label_catch_end_computed = false; node.label_catch_end_value = null; node.exceptionRanges_computed = false; node.exceptionRanges_value = null; node.handlesException_TypeDecl_values = null; node.typeError_computed = false; node.typeError_value = null; node.typeRuntimeException_computed = false; node.typeRuntimeException_value = null; node.in$Circle(false); node.is$Final(false); return node; } @SuppressWarnings({"unchecked", "cast"}) public TryStmt copy() { try { TryStmt node = (TryStmt)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 TryStmt fullCopy() { TryStmt res = (TryStmt)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 BranchTarget.jrag at line 61 public void collectBranches(Collection c) { c.addAll(escapedBranches()); } // Declared in BranchTarget.jrag at line 162 public Stmt branchTarget(Stmt branchStmt) { if(targetBranches().contains(branchStmt)) return this; return super.branchTarget(branchStmt); } // Declared in BranchTarget.jrag at line 200 public void collectFinally(Stmt branchStmt, ArrayList list) { if(hasFinally() && !branchesFromFinally().contains(branchStmt)) list.add(this); if(targetBranches().contains(branchStmt)) return; super.collectFinally(branchStmt, list); } // Declared in ExceptionHandling.jrag at line 203 protected boolean reachedException(TypeDecl type) { boolean found = false; // found is true if the exception type is caught by a catch clause for(int i = 0; i < getNumCatchClause() && !found; i++) if(getCatchClause(i).handles(type)) found = true; // if an exception is thrown in the block and the exception is not caught and // either there is no finally block or the finally block can complete normally if(!found && (!hasFinally() || getFinally().canCompleteNormally()) ) if(getBlock().reachedException(type)) return true; // even if the exception is caught by the catch clauses they may // throw new exceptions for(int i = 0; i < getNumCatchClause() && found; i++) if(getCatchClause(i).reachedException(type)) return true; return hasFinally() && getFinally().reachedException(type); } // Declared in PrettyPrint.jadd at line 706 public void toString(StringBuffer s) { s.append(indent()); s.append("try "); getBlock().toString(s); for(int i = 0; i < getNumCatchClause(); i++) { s.append(indent()); getCatchClause(i).toString(s); } if(hasFinally()) { s.append(indent()); s.append("finally "); getFinally().toString(s); } } // Declared in Statements.jrag at line 321 public void emitFinallyCode(Body b) { if(hasFinally()) { // Clear cached attributes to force re-evaluation of local variables getFinally().flushCaches(); getFinally().jimplify2(b); } } // Declared in Statements.jrag at line 357 public void jimplify2(Body b) { ArrayList ranges = exceptionRanges(); b.addLabel(label_begin()); ranges.add(label_begin()); getBlock().jimplify2(b); soot.jimple.Stmt label_block_end = null; soot.jimple.Stmt label_end = null; if(getBlock().canCompleteNormally()) { if(hasFinally() && getNumCatchClause() != 0) { label_block_end = label_block_end(); b.addLabel(label_block_end); } emitFinallyCode(b); b.setLine(this); if((!hasFinally() || getFinally().canCompleteNormally()) && (getNumCatchClause() != 0 || hasFinally()/*needsFinallyTrap()*/)) b.add(b.newGotoStmt(label_end = label_end(), this)); } if(getNumCatchClause() != 0) { if(label_block_end == null) label_block_end = getCatchClause(0).label(); ranges.add(label_block_end); ranges.add(label_block_end); for(int i = 0; i < getNumCatchClause(); i++) { //beginExceptionRange(b, ranges); getCatchClause(i).jimplify2(b); if(getCatchClause(i).getBlock().canCompleteNormally()) { b.setLine(getCatchClause(i)); endExceptionRange(b, ranges); emitFinallyCode(b); if(!hasFinally() || getFinally().canCompleteNormally()) b.add(b.newGotoStmt(label_end = label_end(), this)); beginExceptionRange(b, ranges); } b.setLine(getCatchClause(i)); //endExceptionRange(b, ranges); } } if(hasFinally() /*&& needsFinallyTrap()*/) { b.addLabel(label_exception_handler()); emitExceptionHandler(b); b.setLine(getFinally()); //if(getFinally().canCompleteNormally()) // b.add(b.newGotoStmt(label_end(), this)); } if(label_end != null) b.addLabel(label_end); // createExceptionTable for(int i = 0; i < getNumCatchClause(); i++) { for(Iterator iter = ranges.iterator(); iter.hasNext(); ) { soot.jimple.Stmt stmtBegin = (soot.jimple.Stmt)iter.next(); soot.jimple.Stmt stmtEnd = (soot.jimple.Stmt)iter.next(); if(stmtBegin != stmtEnd) { b.addTrap( getCatchClause(i).getParameter().type(), stmtBegin, stmtEnd, getCatchClause(i).label() ); } if(stmtEnd == label_block_end) break; } } if(hasFinally() /*&& needsFinallyTrap()*/) { for(Iterator iter = ranges.iterator(); iter.hasNext(); ) { soot.jimple.Stmt stmtBegin = (soot.jimple.Stmt)iter.next(); soot.jimple.Stmt stmtEnd; if(iter.hasNext()) stmtEnd = (soot.jimple.Stmt)iter.next(); else stmtEnd = label_exception_handler(); if(stmtBegin != stmtEnd) b.addTrap(typeThrowable(), stmtBegin, stmtEnd, label_exception_handler()); } /* b.addTrap( typeThrowable(), label_begin(), label_exception_handler(), label_exception_handler() ); */ } } // Declared in Statements.jrag at line 466 public void emitExceptionHandler(Body b) { Local l = b.newTemp(typeThrowable().getSootType()); b.setLine(this); b.add(b.newIdentityStmt(l, b.newCaughtExceptionRef(this), this)); emitFinallyCode(b); //if(hasFinally() && getFinally().canCompleteNormally()) { soot.jimple.Stmt throwStmt = b.newThrowStmt(l, this); throwStmt.addTag(new soot.tagkit.ThrowCreatedByCompilerTag()); b.add(throwStmt); //} } // Declared in java.ast at line 3 // Declared in java.ast line 222 public TryStmt() { super(); setChild(new List(), 1); setChild(new Opt(), 2); } // Declared in java.ast at line 12 // Declared in java.ast line 222 public TryStmt(Block p0, List<CatchClause> p1, Opt<Block> p2) { setChild(p0, 0); setChild(p1, 1); setChild(p2, 2); } // Declared in java.ast at line 18 protected int numChildren() { return 3; } // Declared in java.ast at line 21 public boolean mayHaveRewrite() { return false; } // Declared in java.ast at line 2 // Declared in java.ast line 222 public void setBlock(Block node) { setChild(node, 0); } // Declared in java.ast at line 5 public Block getBlock() { return (Block)getChild(0); } // Declared in java.ast at line 9 public Block getBlockNoTransform() { return (Block)getChildNoTransform(0); } // Declared in java.ast at line 2 // Declared in java.ast line 222 public void setCatchClauseList(List<CatchClause> list) { setChild(list, 1); } // Declared in java.ast at line 6 public int getNumCatchClause() { return getCatchClauseList().getNumChild(); } // Declared in java.ast at line 10 @SuppressWarnings({"unchecked", "cast"}) public CatchClause getCatchClause(int i) { return (CatchClause)getCatchClauseList().getChild(i); } // Declared in java.ast at line 14 public void addCatchClause(CatchClause node) { List<CatchClause> list = (parent == null || state == null) ? getCatchClauseListNoTransform() : getCatchClauseList(); list.addChild(node); } // Declared in java.ast at line 19 public void addCatchClauseNoTransform(CatchClause node) { List<CatchClause> list = getCatchClauseListNoTransform(); list.addChild(node); } // Declared in java.ast at line 24 public void setCatchClause(CatchClause node, int i) { List<CatchClause> list = getCatchClauseList(); list.setChild(node, i); } // Declared in java.ast at line 28 public List<CatchClause> getCatchClauses() { return getCatchClauseList(); } // Declared in java.ast at line 31 public List<CatchClause> getCatchClausesNoTransform() { return getCatchClauseListNoTransform(); } // Declared in java.ast at line 35 @SuppressWarnings({"unchecked", "cast"}) public List<CatchClause> getCatchClauseList() { List<CatchClause> list = (List<CatchClause>)getChild(1); list.getNumChild(); return list; } // Declared in java.ast at line 41 @SuppressWarnings({"unchecked", "cast"}) public List<CatchClause> getCatchClauseListNoTransform() { return (List<CatchClause>)getChildNoTransform(1); } // Declared in java.ast at line 2 // Declared in java.ast line 222 public void setFinallyOpt(Opt<Block> opt) { setChild(opt, 2); } // Declared in java.ast at line 6 public boolean hasFinally() { return getFinallyOpt().getNumChild() != 0; } // Declared in java.ast at line 10 @SuppressWarnings({"unchecked", "cast"}) public Block getFinally() { return (Block)getFinallyOpt().getChild(0); } // Declared in java.ast at line 14 public void setFinally(Block node) { getFinallyOpt().setChild(node, 0); } // Declared in java.ast at line 17 @SuppressWarnings({"unchecked", "cast"}) public Opt<Block> getFinallyOpt() { return (Opt<Block>)getChild(2); } // Declared in java.ast at line 21 @SuppressWarnings({"unchecked", "cast"}) public Opt<Block> getFinallyOptNoTransform() { return (Opt<Block>)getChildNoTransform(2); } protected boolean branches_computed = false; protected Collection branches_value; // Declared in BranchTarget.jrag at line 116 @SuppressWarnings({"unchecked", "cast"}) public Collection branches() { if(branches_computed) { return branches_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); branches_value = branches_compute(); if(isFinal && num == state().boundariesCrossed) branches_computed = true; return branches_value; } private Collection branches_compute() { HashSet set = new HashSet(); getBlock().collectBranches(set); for(int i = 0; i < getNumCatchClause(); i++) getCatchClause(i).collectBranches(set); return set; } protected boolean branchesFromFinally_computed = false; protected Collection branchesFromFinally_value; // Declared in BranchTarget.jrag at line 124 @SuppressWarnings({"unchecked", "cast"}) public Collection branchesFromFinally() { if(branchesFromFinally_computed) { return branchesFromFinally_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); branchesFromFinally_value = branchesFromFinally_compute(); if(isFinal && num == state().boundariesCrossed) branchesFromFinally_computed = true; return branchesFromFinally_value; } private Collection branchesFromFinally_compute() { HashSet set = new HashSet(); if(hasFinally()) getFinally().collectBranches(set); return set; } protected boolean targetBranches_computed = false; protected Collection targetBranches_value; // Declared in BranchTarget.jrag at line 132 @SuppressWarnings({"unchecked", "cast"}) public Collection targetBranches() { if(targetBranches_computed) { return targetBranches_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); targetBranches_value = targetBranches_compute(); if(isFinal && num == state().boundariesCrossed) targetBranches_computed = true; return targetBranches_value; } private Collection targetBranches_compute() { HashSet set = new HashSet(); if(hasFinally() && !getFinally().canCompleteNormally()) set.addAll(branches()); return set; } protected boolean escapedBranches_computed = false; protected Collection escapedBranches_value; // Declared in BranchTarget.jrag at line 140 @SuppressWarnings({"unchecked", "cast"}) public Collection escapedBranches() { if(escapedBranches_computed) { return escapedBranches_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); escapedBranches_value = escapedBranches_compute(); if(isFinal && num == state().boundariesCrossed) escapedBranches_computed = true; return escapedBranches_value; } private Collection escapedBranches_compute() { HashSet set = new HashSet(); if(hasFinally()) set.addAll(branchesFromFinally()); if(!hasFinally() || getFinally().canCompleteNormally()) set.addAll(branches()); return set; } // Declared in DefiniteAssignment.jrag at line 667 @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) { // 16.2.15 4th bullet if(!hasFinally()) { if(!getBlock().isDAafter(v)) return false; for(int i = 0; i < getNumCatchClause(); i++) if(!getCatchClause(i).getBlock().isDAafter(v)) return false; return true; } else { // 16.2.15 5th bullet if(getFinally().isDAafter(v)) return true; if(!getBlock().isDAafter(v)) return false; for(int i = 0; i < getNumCatchClause(); i++) if(!getCatchClause(i).getBlock().isDAafter(v)) return false; return true; } } // Declared in DefiniteAssignment.jrag at line 918 @SuppressWarnings({"unchecked", "cast"}) public boolean isDUafterFinally(Variable v) { ASTNode$State state = state(); boolean isDUafterFinally_Variable_value = isDUafterFinally_compute(v); return isDUafterFinally_Variable_value; } private boolean isDUafterFinally_compute(Variable v) { return getFinally().isDUafter(v); } // Declared in DefiniteAssignment.jrag at line 921 @SuppressWarnings({"unchecked", "cast"}) public boolean isDAafterFinally(Variable v) { ASTNode$State state = state(); boolean isDAafterFinally_Variable_value = isDAafterFinally_compute(v); return isDAafterFinally_Variable_value; } private boolean isDAafterFinally_compute(Variable v) { return getFinally().isDAafter(v); } protected java.util.Map isDUbefore_Variable_values; // Declared in DefiniteAssignment.jrag at line 1189 @SuppressWarnings({"unchecked", "cast"}) public boolean isDUbefore(Variable v) { Object _parameters = v; if(isDUbefore_Variable_values == null) isDUbefore_Variable_values = new java.util.HashMap(4); ASTNode$State.CircularValue _value; if(isDUbefore_Variable_values.containsKey(_parameters)) { Object _o = isDUbefore_Variable_values.get(_parameters); if(!(_o instanceof ASTNode$State.CircularValue)) { return ((Boolean)_o).booleanValue(); } else _value = (ASTNode$State.CircularValue)_o; } else { _value = new ASTNode$State.CircularValue(); isDUbefore_Variable_values.put(_parameters, _value); _value.value = Boolean.valueOf(true); } ASTNode$State state = state(); if (!state.IN_CIRCLE) { state.IN_CIRCLE = true; int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); boolean new_isDUbefore_Variable_value; do { _value.visited = new Integer(state.CIRCLE_INDEX); state.CHANGE = false; new_isDUbefore_Variable_value = isDUbefore_compute(v); if (new_isDUbefore_Variable_value!=((Boolean)_value.value).booleanValue()) { state.CHANGE = true; _value.value = Boolean.valueOf(new_isDUbefore_Variable_value); } state.CIRCLE_INDEX++; } while (state.CHANGE); if(isFinal && num == state().boundariesCrossed) { isDUbefore_Variable_values.put(_parameters, new_isDUbefore_Variable_value); } else { isDUbefore_Variable_values.remove(_parameters); state.RESET_CYCLE = true; isDUbefore_compute(v); state.RESET_CYCLE = false; } state.IN_CIRCLE = false; return new_isDUbefore_Variable_value; } if(!new Integer(state.CIRCLE_INDEX).equals(_value.visited)) { _value.visited = new Integer(state.CIRCLE_INDEX); boolean new_isDUbefore_Variable_value = isDUbefore_compute(v); if (state.RESET_CYCLE) { isDUbefore_Variable_values.remove(_parameters); } else if (new_isDUbefore_Variable_value!=((Boolean)_value.value).booleanValue()) { state.CHANGE = true; _value.value = new_isDUbefore_Variable_value; } return new_isDUbefore_Variable_value; } return ((Boolean)_value.value).booleanValue(); } private boolean isDUbefore_compute(Variable v) { return super.isDUbefore(v); } // Declared in DefiniteAssignment.jrag at line 1225 @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) { // 16.2.14 4th bullet if(!hasFinally()) { if(!getBlock().isDUafter(v)) return false; for(int i = 0; i < getNumCatchClause(); i++) if(!getCatchClause(i).getBlock().isDUafter(v)) return false; return true; } else return getFinally().isDUafter(v); } protected java.util.Map reachableThrow_CatchClause_values; // Declared in ExceptionHandling.jrag at line 193 @SuppressWarnings({"unchecked", "cast"}) public boolean reachableThrow(CatchClause c) { Object _parameters = c; if(reachableThrow_CatchClause_values == null) reachableThrow_CatchClause_values = new java.util.HashMap(4); if(reachableThrow_CatchClause_values.containsKey(_parameters)) { return ((Boolean)reachableThrow_CatchClause_values.get(_parameters)).booleanValue(); } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); boolean reachableThrow_CatchClause_value = reachableThrow_compute(c); if(isFinal && num == state().boundariesCrossed) reachableThrow_CatchClause_values.put(_parameters, Boolean.valueOf(reachableThrow_CatchClause_value)); return reachableThrow_CatchClause_value; } private boolean reachableThrow_compute(CatchClause c) { return getBlock().reachedException(c.getParameter().type()); } // Declared in UnreachableStatements.jrag at line 113 @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() { boolean anyCatchClauseCompleteNormally = false; for(int i = 0; i < getNumCatchClause() && !anyCatchClauseCompleteNormally; i++) anyCatchClauseCompleteNormally = getCatchClause(i).getBlock().canCompleteNormally(); return (getBlock().canCompleteNormally() || anyCatchClauseCompleteNormally) && (!hasFinally() || getFinally().canCompleteNormally()); } // Declared in Statements.jrag at line 207 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt break_label() { ASTNode$State state = state(); soot.jimple.Stmt break_label_value = break_label_compute(); return break_label_value; } private soot.jimple.Stmt break_label_compute() { return label_finally(); } // Declared in Statements.jrag at line 231 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt continue_label() { ASTNode$State state = state(); soot.jimple.Stmt continue_label_value = continue_label_compute(); return continue_label_value; } private soot.jimple.Stmt continue_label_compute() { return label_finally(); } protected boolean label_begin_computed = false; protected soot.jimple.Stmt label_begin_value; // Declared in Statements.jrag at line 338 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_begin() { if(label_begin_computed) { return label_begin_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_begin_value = label_begin_compute(); if(isFinal && num == state().boundariesCrossed) label_begin_computed = true; return label_begin_value; } private soot.jimple.Stmt label_begin_compute() { return newLabel(); } protected boolean label_block_end_computed = false; protected soot.jimple.Stmt label_block_end_value; // Declared in Statements.jrag at line 339 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_block_end() { if(label_block_end_computed) { return label_block_end_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_block_end_value = label_block_end_compute(); if(isFinal && num == state().boundariesCrossed) label_block_end_computed = true; return label_block_end_value; } private soot.jimple.Stmt label_block_end_compute() { return newLabel(); } protected boolean label_end_computed = false; protected soot.jimple.Stmt label_end_value; // Declared in Statements.jrag at line 340 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_end() { if(label_end_computed) { return label_end_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_end_value = label_end_compute(); if(isFinal && num == state().boundariesCrossed) label_end_computed = true; return label_end_value; } private soot.jimple.Stmt label_end_compute() { return newLabel(); } protected boolean label_finally_computed = false; protected soot.jimple.Stmt label_finally_value; // Declared in Statements.jrag at line 341 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_finally() { if(label_finally_computed) { return label_finally_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_finally_value = label_finally_compute(); if(isFinal && num == state().boundariesCrossed) label_finally_computed = true; return label_finally_value; } private soot.jimple.Stmt label_finally_compute() { return newLabel(); } protected boolean label_finally_block_computed = false; protected soot.jimple.Stmt label_finally_block_value; // Declared in Statements.jrag at line 342 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_finally_block() { if(label_finally_block_computed) { return label_finally_block_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_finally_block_value = label_finally_block_compute(); if(isFinal && num == state().boundariesCrossed) label_finally_block_computed = true; return label_finally_block_value; } private soot.jimple.Stmt label_finally_block_compute() { return newLabel(); } protected boolean label_exception_handler_computed = false; protected soot.jimple.Stmt label_exception_handler_value; // Declared in Statements.jrag at line 343 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_exception_handler() { if(label_exception_handler_computed) { return label_exception_handler_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_exception_handler_value = label_exception_handler_compute(); if(isFinal && num == state().boundariesCrossed) label_exception_handler_computed = true; return label_exception_handler_value; } private soot.jimple.Stmt label_exception_handler_compute() { return newLabel(); } protected boolean label_catch_end_computed = false; protected soot.jimple.Stmt label_catch_end_value; // Declared in Statements.jrag at line 344 @SuppressWarnings({"unchecked", "cast"}) public soot.jimple.Stmt label_catch_end() { if(label_catch_end_computed) { return label_catch_end_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); label_catch_end_value = label_catch_end_compute(); if(isFinal && num == state().boundariesCrossed) label_catch_end_computed = true; return label_catch_end_value; } private soot.jimple.Stmt label_catch_end_compute() { return newLabel(); } // Declared in Statements.jrag at line 346 @SuppressWarnings({"unchecked", "cast"}) public boolean needsFinallyTrap() { ASTNode$State state = state(); boolean needsFinallyTrap_value = needsFinallyTrap_compute(); return needsFinallyTrap_value; } private boolean needsFinallyTrap_compute() { return getNumCatchClause() != 0 || enclosedByExceptionHandler(); } protected boolean exceptionRanges_computed = false; protected ArrayList exceptionRanges_value; // Declared in Statements.jrag at line 450 @SuppressWarnings({"unchecked", "cast"}) public ArrayList exceptionRanges() { if(exceptionRanges_computed) { return exceptionRanges_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); exceptionRanges_value = exceptionRanges_compute(); if(isFinal && num == state().boundariesCrossed) exceptionRanges_computed = true; return exceptionRanges_value; } private ArrayList exceptionRanges_compute() { return new ArrayList(); } protected java.util.Map handlesException_TypeDecl_values; // Declared in ExceptionHandling.jrag at line 35 @SuppressWarnings({"unchecked", "cast"}) public boolean handlesException(TypeDecl exceptionType) { Object _parameters = exceptionType; if(handlesException_TypeDecl_values == null) handlesException_TypeDecl_values = new java.util.HashMap(4); if(handlesException_TypeDecl_values.containsKey(_parameters)) { return ((Boolean)handlesException_TypeDecl_values.get(_parameters)).booleanValue(); } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); boolean handlesException_TypeDecl_value = getParent().Define_boolean_handlesException(this, null, exceptionType); if(isFinal && num == state().boundariesCrossed) handlesException_TypeDecl_values.put(_parameters, Boolean.valueOf(handlesException_TypeDecl_value)); return handlesException_TypeDecl_value; } protected boolean typeError_computed = false; protected TypeDecl typeError_value; // Declared in UnreachableStatements.jrag at line 136 @SuppressWarnings({"unchecked", "cast"}) public TypeDecl typeError() { if(typeError_computed) { return typeError_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); typeError_value = getParent().Define_TypeDecl_typeError(this, null); if(isFinal && num == state().boundariesCrossed) typeError_computed = true; return typeError_value; } protected boolean typeRuntimeException_computed = false; protected TypeDecl typeRuntimeException_value; // Declared in UnreachableStatements.jrag at line 137 @SuppressWarnings({"unchecked", "cast"}) public TypeDecl typeRuntimeException() { if(typeRuntimeException_computed) { return typeRuntimeException_value; } ASTNode$State state = state(); int num = state.boundariesCrossed; boolean isFinal = this.is$Final(); typeRuntimeException_value = getParent().Define_TypeDecl_typeRuntimeException(this, null); if(isFinal && num == state().boundariesCrossed) typeRuntimeException_computed = true; return typeRuntimeException_value; } // Declared in Statements.jrag at line 347 @SuppressWarnings({"unchecked", "cast"}) public boolean enclosedByExceptionHandler() { ASTNode$State state = state(); boolean enclosedByExceptionHandler_value = getParent().Define_boolean_enclosedByExceptionHandler(this, null); return enclosedByExceptionHandler_value; } // Declared in Statements.jrag at line 463 @SuppressWarnings({"unchecked", "cast"}) public TypeDecl typeThrowable() { ASTNode$State state = state(); TypeDecl typeThrowable_value = getParent().Define_TypeDecl_typeThrowable(this, null); return typeThrowable_value; } // Declared in DefiniteAssignment.jrag at line 666 public boolean Define_boolean_isDAbefore(ASTNode caller, ASTNode child, Variable v) { if(caller == getFinallyOptNoTransform()) { return isDAbefore(v); } if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); return getBlock().isDAbefore(v); } if(caller == getBlockNoTransform()) { return isDAbefore(v); } return getParent().Define_boolean_isDAbefore(this, caller, v); } // Declared in DefiniteAssignment.jrag at line 1216 public boolean Define_boolean_isDUbefore(ASTNode caller, ASTNode child, Variable v) { if(caller == getFinallyOptNoTransform()){ if(!getBlock().isDUeverywhere(v)) return false; for(int i = 0; i < getNumCatchClause(); i++) if(!getCatchClause(i).getBlock().unassignedEverywhere(v, this)) return false; return true; } if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); { if(!getBlock().isDUafter(v)) return false; if(!getBlock().isDUeverywhere(v)) return false; return true; } } if(caller == getBlockNoTransform()) { return isDUbefore(v); } return getParent().Define_boolean_isDUbefore(this, caller, v); } // Declared in ExceptionHandling.jrag at line 179 public boolean Define_boolean_handlesException(ASTNode caller, ASTNode child, TypeDecl exceptionType) { if(caller == getBlockNoTransform()){ for(int i = 0; i < getNumCatchClause(); i++) if(getCatchClause(i).handles(exceptionType)) return true; if(hasFinally() && !getFinally().canCompleteNormally()) return true; return handlesException(exceptionType); } if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); { if(hasFinally() && !getFinally().canCompleteNormally()) return true; return handlesException(exceptionType); } } return getParent().Define_boolean_handlesException(this, caller, exceptionType); } // Declared in UnreachableStatements.jrag at line 121 public boolean Define_boolean_reachable(ASTNode caller, ASTNode child) { if(caller == getFinallyOptNoTransform()) { return reachable(); } if(caller == getBlockNoTransform()) { return reachable(); } return getParent().Define_boolean_reachable(this, caller); } // Declared in UnreachableStatements.jrag at line 125 public boolean Define_boolean_reachableCatchClause(ASTNode caller, ASTNode child) { if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); { TypeDecl type = getCatchClause(childIndex).getParameter().type(); for(int i = 0; i < childIndex; i++) if(getCatchClause(i).handles(type)) return false; if(reachableThrow(getCatchClause(childIndex))) return true; if(type.mayCatch(typeError()) || type.mayCatch(typeRuntimeException())) return true; return false; } } return getParent().Define_boolean_reachableCatchClause(this, caller); } // Declared in UnreachableStatements.jrag at line 154 public boolean Define_boolean_reportUnreachable(ASTNode caller, ASTNode child) { if(caller == getFinallyOptNoTransform()) { return reachable(); } if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); return reachable(); } if(caller == getBlockNoTransform()) { return reachable(); } return getParent().Define_boolean_reportUnreachable(this, caller); } // Declared in Statements.jrag at line 352 public boolean Define_boolean_enclosedByExceptionHandler(ASTNode caller, ASTNode child) { if(caller == getBlockNoTransform()) { return true; } return getParent().Define_boolean_enclosedByExceptionHandler(this, caller); } // Declared in Statements.jrag at line 446 public ArrayList Define_ArrayList_exceptionRanges(ASTNode caller, ASTNode child) { if(caller == getCatchClauseListNoTransform()) { int childIndex = caller.getIndexOfChild(child); return exceptionRanges(); } if(caller == getBlockNoTransform()) { return exceptionRanges(); } return getParent().Define_ArrayList_exceptionRanges(this, caller); } public ASTNode rewriteTo() { return super.rewriteTo(); } }