< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java

Print this page

        

*** 253,262 **** --- 253,302 ---- } finally { log.popDiagnosticHandler(diagHandler); } } + public boolean aliveAfter(Env<AttrContext> env, JCTree that, TreeMaker make) { + //we need to disable diagnostics temporarily; the problem is that if + //"that" contains e.g. an unreachable statement, an error + //message will be reported and will cause compilation to skip the flow analyis + //step - if we suppress diagnostics, we won't stop at Attr for flow-analysis + //related errors, which will allow for more errors to be detected + Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); + try { + SnippetAliveAnalyzer analyzer = new SnippetAliveAnalyzer(); + + analyzer.analyzeTree(env, that, make); + return analyzer.isAlive(); + } finally { + log.popDiagnosticHandler(diagHandler); + } + } + + public boolean breaksOutOf(Env<AttrContext> env, JCTree loop, JCTree body, TreeMaker make) { + //we need to disable diagnostics temporarily; the problem is that if + //"that" contains e.g. an unreachable statement, an error + //message will be reported and will cause compilation to skip the flow analyis + //step - if we suppress diagnostics, we won't stop at Attr for flow-analysis + //related errors, which will allow for more errors to be detected + Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); + try { + boolean[] breaksOut = new boolean[1]; + new AliveAnalyzer() { + @Override + public void visitBreak(JCBreak tree) { + breaksOut[0] |= (super.alive == Liveness.ALIVE && tree.target == loop); + super.visitBreak(tree); + } + }.analyzeTree(env, body, make); + + return breaksOut[0]; + } finally { + log.popDiagnosticHandler(diagHandler); + } + } + /** * Definite assignment scan mode */ enum FlowKind { /**
*** 1465,1474 **** --- 1505,1527 ---- //skip } } /** + * Determine if alive after the given tree. + */ + class SnippetAliveAnalyzer extends AliveAnalyzer { + @Override + public void visitClassDef(JCClassDecl tree) { + //skip + } + public boolean isAlive() { + return super.alive != Liveness.DEAD; + } + } + + /** * Specialized pass that performs DA/DU on a lambda */ class LambdaAssignAnalyzer extends AssignAnalyzer { WriteableScope enclosedSymbols; boolean inLambda;
< prev index next >