private void visitCatchFinally(Map<Variable, VariableState> initialVarState, List<Map<Variable, VariableState>> afterTryCatchStates, CatchStatement catchStatement, Statement finallyStatement) { pushState(); // getState().clear(); getState().putAll(initialVarState); Statement code = catchStatement.getCode(); catchStatement.visit(this); visitPossiblyEmptyStatement(finallyStatement); if (code == null || !returningBlock(code)) { afterTryCatchStates.add(new HashMap<Variable, VariableState>(getState())); } popState(); }
@Override public void visitIfElse(final IfStatement ifElse) { visitStatement(ifElse); ifElse.getBooleanExpression().visit(this); Map<Variable, VariableState> ifState = pushState(); ifElse.getIfBlock().visit(this); popState(); Statement elseBlock = ifElse.getElseBlock(); Map<Variable, VariableState> elseState = pushState(); visitPossiblyEmptyStatement(elseBlock); popState(); // merge if/else branches Map<Variable, VariableState> curState = getState(); Set<Variable> allVars = new HashSet<Variable>(); allVars.addAll(curState.keySet()); allVars.addAll(ifState.keySet()); allVars.addAll(elseState.keySet()); for (Variable var : allVars) { VariableState beforeValue = curState.get(var); VariableState ifValue = ifState.get(var); VariableState elseValue = elseState.get(var); // merge if and else values VariableState mergedIfElse; mergedIfElse = isFinal(ifValue) && isFinal(elseValue) ? VariableState.is_final : VariableState.is_var; if (beforeValue != null) { curState.put(var, mergedIfElse); } } }
List<Map<Variable, VariableState>> afterStates = new ArrayList<>(); visitPossiblyEmptyStatement(finallyStatement); if (!returningBlock(tryStatement)) { afterStates.add(new HashMap<Variable, VariableState>(getState())); visitPossiblyEmptyStatement(finallyStatement); if (!returningBlock(tryStatement)) { afterStates.add(new HashMap<Variable, VariableState>(getState()));