private void buildThrowStatement(ThrowStatementTree throwStatementTree) { Block jumpTo = exitBlock(); TryStatement enclosingTryCatch = enclosingTry.peek(); if(enclosingTryCatch != null){ jumpTo = enclosingTryCatch.catches.keySet().stream() .filter(t -> throwStatementTree.expression().symbolType().isSubtypeOf(t)) .findFirst() .map(t -> enclosingTryCatch.catches.get(t)) .orElse(exitBlock()); } currentBlock = createUnconditionalJump(throwStatementTree, jumpTo, currentBlock); build(throwStatementTree.expression()); }
private void buildThrowStatement(ThrowStatementTree throwStatementTree) { Block jumpTo = exitBlock(); TryStatement enclosingTryCatch = enclosingTry.peek(); if(enclosingTryCatch != null){ jumpTo = enclosingTryCatch.catches.keySet().stream() .filter(t -> throwStatementTree.expression().symbolType().isSubtypeOf(t)) .findFirst() .map(t -> enclosingTryCatch.catches.get(t)) .orElse(exitBlock()); } currentBlock = createUnconditionalJump(throwStatementTree, jumpTo, currentBlock); build(throwStatementTree.expression()); }
private Block createUnconditionalJump(Tree terminator, @Nullable Block target, @Nullable Block successorWithoutJump) { Block result = createBlock(); result.terminator = terminator; if (target != null) { if (target == exitBlock()) { result.addExitSuccessor(target); } else { result.addSuccessor(target); } } result.successorWithoutJump = successorWithoutJump; return result; }
private Block createUnconditionalJump(Tree terminator, @Nullable Block target, @Nullable Block successorWithoutJump) { Block result = createBlock(); result.terminator = terminator; if (target != null) { if (target == exitBlock()) { result.addExitSuccessor(target); } else { result.addSuccessor(target); } } result.successorWithoutJump = successorWithoutJump; return result; }
private CFG(List<? extends Tree> trees, Symbol.MethodSymbol symbol, boolean ignoreBreakAndContinue) { methodSymbol = symbol; this.ignoreBreakAndContinue = ignoreBreakAndContinue; exitBlocks.add(createBlock()); currentBlock = createBlock(exitBlock()); outerTry = new TryStatement(); outerTry.successorBlock = exitBlocks.peek(); enclosingTry.add(outerTry); enclosedByCatch.push(false); build(trees); prune(); computePredecessors(blocks); }
private Block createUnconditionalJump(Tree terminator, @Nullable Block target) { Block result = createBlock(); result.terminator = terminator; if (target != null) { if (target == exitBlock()) { result.addExitSuccessor(target); } else { result.addSuccessor(target); } } return result; }
private void buildThrowStatement(ThrowStatementTree throwStatementTree) { // FIXME this won't work if it is intended to be caught by a try statement. currentBlock = createUnconditionalJump(throwStatementTree, exitBlock()); build(throwStatementTree.expression()); }
private CFG(List<? extends Tree> trees, Symbol.MethodSymbol symbol, boolean ignoreBreakAndContinue) { methodSymbol = symbol; this.ignoreBreakAndContinue = ignoreBreakAndContinue; exitBlocks.add(createBlock()); currentBlock = createBlock(exitBlock()); outerTry = new TryStatement(); outerTry.successorBlock = exitBlocks.peek(); enclosingTry.add(outerTry); enclosedByCatch.push(false); build(trees); prune(); computePredecessors(blocks); }
private void buildReturnStatement(ReturnStatementTree returnStatement) { currentBlock = createUnconditionalJump(returnStatement, exitBlock(), currentBlock); ExpressionTree expression = returnStatement.expression(); if (expression != null) { build(expression); } }
private void buildReturnStatement(ReturnStatementTree returnStatement) { currentBlock = createUnconditionalJump(returnStatement, exitBlock(), currentBlock); ExpressionTree expression = returnStatement.expression(); if (expression != null) { build(expression); } }
private void buildReturnStatement(ReturnStatementTree returnStatement) { currentBlock = createUnconditionalJump(returnStatement, exitBlock()); ExpressionTree expression = returnStatement.expression(); if (expression != null) { build(expression); } }
private CFG(BlockTree tree, Symbol.MethodSymbol symbol) { methodSymbol = symbol; exitBlocks.add(createBlock()); currentBlock = createBlock(exitBlock()); for (StatementTree statementTree : Lists.reverse(tree.body())) { build(statementTree); } prune(); computePredecessors(blocks); }
Block finallyBlock = currentBlock; build(finallyBlockTree); finallyBlock.addExitSuccessor(exitBlock()); exitBlocks.push(currentBlock); addContinueTarget(currentBlock);
Block finallyBlock = currentBlock; build(finallyBlockTree); finallyBlock.addExitSuccessor(exitBlock()); exitBlocks.push(currentBlock); addContinueTarget(currentBlock);
Block finallyBlock = currentBlock; build(finallyBlockTree); finallyBlock.addExitSuccessor(exitBlock()); exitBlocks.push(currentBlock);
private void execute(MethodTree tree) { CFG cfg = CFG.build(tree); exitBlock = cfg.exitBlock(); checkerDispatcher.init(tree, cfg); liveVariables = LiveVariables.analyze(cfg);
private void execute(MethodTree tree) { CFG cfg = CFG.build(tree); exitBlock = cfg.exitBlock(); checkerDispatcher.init(tree, cfg); liveVariables = LiveVariables.analyze(cfg);