final Node trueEnd = lastOrDefault(condition.getTrueBlock().getBody()); final Node falseEnd = lastOrDefault(condition.getFalseBlock().getBody()); blockBody.addAll(i + 1, condition.getFalseBlock().getChildren()); condition.setFalseBlock(new Block()); blockBody.addAll(i + 1, condition.getTrueBlock().getChildren()); condition.setTrueBlock(new Block()); if (condition.getTrueBlock().getChildren().isEmpty() && !condition.getFalseBlock().getChildren().isEmpty()) { final Block temp = condition.getTrueBlock(); final Expression conditionExpression = condition.getCondition(); condition.setTrueBlock(condition.getFalseBlock()); condition.setFalseBlock(temp); condition.setCondition(simplifyLogicalNot(new Expression(AstCode.LogicalNot, null, conditionExpression.getOffset(), conditionExpression)));
private void buildCondition(final BasicBlock curBlock, BasicBlock nextBlock, JumpContext jc, Condition condition) { BasicBlock lastBlock = buildExpr(curBlock, condition.getCondition(), jc); if (!condition.getTrueBlock().getBody().isEmpty()) { BasicBlock leftBlock = new BasicBlock(); lastBlock.addTarget(EdgeType.TRUE, leftBlock); buildBlock(leftBlock, nextBlock, jc, condition.getTrueBlock()); } else { lastBlock.addTarget(EdgeType.TRUE, nextBlock); } if (!condition.getFalseBlock().getBody().isEmpty()) { BasicBlock rightBlock = new BasicBlock(); lastBlock.addTarget(EdgeType.FALSE, rightBlock); buildBlock(rightBlock, nextBlock, jc, condition.getFalseBlock()); } else { lastBlock.addTarget(EdgeType.FALSE, nextBlock); } }
final Condition conditionNode = new Condition(); final Block trueBlock = new Block(); final Block falseBlock = new Block(); falseBlock.setEntryGoto(new Expression(AstCode.Goto, falseLabel.get(), Expression.MYSTERY_OFFSET)); conditionNode.setCondition(condition.get()); conditionNode.setTrueBlock(trueBlock); conditionNode.setFalseBlock(falseBlock); final Set<ControlFlowNode> content = findDominatedNodes(scope, trueTarget); scope.removeAll(content); conditionNode.getTrueBlock().getBody().addAll(findConditions(content, trueTarget)); final Set<ControlFlowNode> content = findDominatedNodes(scope, falseTarget); scope.removeAll(content); conditionNode.getFalseBlock().getBody().addAll(findConditions(content, falseTarget));
private static int getOffset(Node node) { if (node instanceof Expression) { Expression expr = (Expression) node; return expr.getOffset(); } else if (node instanceof Condition) { return ((Condition) node).getCondition().getOffset(); } else if (node instanceof Block) { List<Node> body = ((Block) node).getBody(); return body.stream().mapToInt(MethodData::getOffset).filter(off -> off != Expression.MYSTERY_OFFSET).findFirst().orElse( Expression.MYSTERY_OFFSET); } else if (node instanceof Loop) { Loop loop = (Loop)node; return loop.getLoopType() == LoopType.PreCondition && loop.getCondition() != null ? loop.getCondition() .getOffset() : getOffset(loop.getBody()); } else if (node instanceof Switch) { return ((Switch)node).getCondition().getOffset(); } return Expression.MYSTERY_OFFSET; }
final Block falseBlock = condition.getFalseBlock(); final Condition c = (Condition) grandparent; if (c.getTrueBlock().getBody().size() == 1 && r == last(c.getTrueBlock().getBody()) && (matchNullOrEmpty(c.getFalseBlock()) || matchEmptyReturn(c.getFalseBlock()))) {
@AstVisitor public void visit(Node node, MethodContext mc, MethodDefinition md) { if (node instanceof Condition) { Condition cond = (Condition) node; Expression expr = cond.getCondition(); check(expr, cond.getTrueBlock(), mc, false); check(expr, cond.getFalseBlock(), mc, true); } if (node instanceof Expression) { Expression expr = (Expression) node; if (expr.getCode() == AstCode.LogicalAnd || expr.getCode() == AstCode.LogicalOr) { check(expr.getArguments().get(0), expr.getArguments().get(1), expr.getCode(), mc); } } }
final Condition conditionNode = new Condition(); final Block trueBlock = new Block(); final Block falseBlock = new Block(); conditionNode.setCondition(condition.get()); conditionNode.setTrueBlock(trueBlock); conditionNode.setFalseBlock(falseBlock); final Set<ControlFlowNode> content = findDominatedNodes(scope, trueTarget); scope.removeAll(content); conditionNode.getTrueBlock().getBody().addAll(findConditions(content, trueTarget)); final Set<ControlFlowNode> content = findDominatedNodes(scope, falseTarget); scope.removeAll(content); conditionNode.getFalseBlock().getBody().addAll(findConditions(content, falseTarget));
Node node2 = list.get(1); if (node1 instanceof Condition) { Expression cond = ((Condition) node1).getCondition(); if (cond.getCode() == AstCode.LogicalNot && cond.getArguments().get(0).getCode() == AstCode.InstanceOf) { if (Nodes.isOp(node2, AstCode.Return)) {
final Block falseBlock = condition.getFalseBlock(); final Condition c = (Condition) grandparent; if (c.getTrueBlock().getBody().size() == 1 && r == last(c.getTrueBlock().getBody()) && (matchNullOrEmpty(c.getFalseBlock()) || matchEmptyReturn(c.getFalseBlock()))) {
final Node trueEnd = lastOrDefault(condition.getTrueBlock().getBody()); final Node falseEnd = lastOrDefault(condition.getFalseBlock().getBody()); blockBody.addAll(i + 1, condition.getFalseBlock().getChildren()); condition.setFalseBlock(new Block()); blockBody.addAll(i + 1, condition.getTrueBlock().getChildren()); condition.setTrueBlock(new Block()); if (condition.getTrueBlock().getChildren().isEmpty() && !condition.getFalseBlock().getChildren().isEmpty()) { final Block temp = condition.getTrueBlock(); final Expression conditionExpression = condition.getCondition(); condition.setTrueBlock(condition.getFalseBlock()); condition.setFalseBlock(temp); condition.setCondition(simplifyLogicalNot(new Expression(AstCode.LogicalNot, null, conditionExpression.getOffset(), conditionExpression)));
if (node instanceof Condition) { Condition cond = (Condition) node; if (Equi.equiBlocks(cond.getTrueBlock(), cond.getFalseBlock())) { if (cond.getTrueBlock() == null || cond.getTrueBlock().getBody().isEmpty()) { mc.report("EmptyBranch", 0, cond.getCondition()); if(cond.getTrueBlock().getBody().size() == 1 && Nodes.isOp(cond.getTrueBlock().getBody().get(0), AstCode.LoopOrSwitchBreak) && nc.getNode() instanceof CaseBlock) return; mc.report("SameBranchesIf", computePriority(cond.getTrueBlock(), 2), cond.getTrueBlock(), SAME_BRANCH.create(mc, cond.getFalseBlock()));
final Condition conditionNode = new Condition(); final Block trueBlock = new Block(); final Block falseBlock = new Block(); falseBlock.setEntryGoto(new Expression(AstCode.Goto, falseLabel.get(), Expression.MYSTERY_OFFSET)); conditionNode.setCondition(condition.get()); conditionNode.setTrueBlock(trueBlock); conditionNode.setFalseBlock(falseBlock); final Set<ControlFlowNode> content = findDominatedNodes(scope, trueTarget); scope.removeAll(content); conditionNode.getTrueBlock().getBody().addAll(findConditions(content, trueTarget)); final Set<ControlFlowNode> content = findDominatedNodes(scope, falseTarget); scope.removeAll(content); conditionNode.getFalseBlock().getBody().addAll(findConditions(content, falseTarget));
((Condition) node).getCondition().setExpectedType(BuiltinTypes.Boolean);
final Block falseBlock = condition.getFalseBlock(); final Condition c = (Condition) grandparent; if (c.getTrueBlock().getBody().size() == 1 && r == last(c.getTrueBlock().getBody()) && (matchNullOrEmpty(c.getFalseBlock()) || matchEmptyReturn(c.getFalseBlock()))) {
final Node trueEnd = lastOrDefault(condition.getTrueBlock().getBody()); final Node falseEnd = lastOrDefault(condition.getFalseBlock().getBody()); blockBody.addAll(i + 1, condition.getFalseBlock().getChildren()); condition.setFalseBlock(new Block()); blockBody.addAll(i + 1, condition.getTrueBlock().getChildren()); condition.setTrueBlock(new Block()); if (condition.getTrueBlock().getChildren().isEmpty() && !condition.getFalseBlock().getChildren().isEmpty()) { final Block temp = condition.getTrueBlock(); final Expression conditionExpression = condition.getCondition(); condition.setTrueBlock(condition.getFalseBlock()); condition.setFalseBlock(temp); condition.setCondition(simplifyLogicalNot(new Expression(AstCode.LogicalNot, null, conditionExpression.getOffset(), conditionExpression)));
Condition cond1 = (Condition) first; Condition cond2 = (Condition) second; if (!cond1.getFalseBlock().getBody().isEmpty()) continue; Expression c1 = cond1.getCondition(); Expression c2 = cond2.getCondition(); if (Nodes.isPure(c1) && Equi.equiExpressions(c1, c2)) { Set<Variable> vars = Exprs.stream(c1).filter(e -> e.getCode() == AstCode.Load).map( e -> (Variable) e.getOperand()).collect(Collectors.toSet()); if (Nodes.find(cond1.getTrueBlock(), n -> Nodes.isWriteTo(n, vars)) != null) continue; return false; int priority = 0; if(!cond1.getTrueBlock().getBody().isEmpty() && cond1.getTrueBlock().getBody().get(0) instanceof Condition) { priority += 15; if(!cond2.getFalseBlock().getBody().isEmpty()) { priority += 10;
((Condition) node).getCondition().setExpectedType(BuiltinTypes.Boolean);
Condition leftCond = (Condition) leftNode; Condition rightCond = (Condition) rightNode; if (!equiExpressions(leftCond.getCondition(), rightCond.getCondition(), ctx)) return false; if (!equiBlocks(leftCond.getTrueBlock(), rightCond.getTrueBlock(), ctx)) return false; if (!equiBlocks(leftCond.getFalseBlock(), rightCond.getFalseBlock(), ctx)) return false; } else if (leftNode instanceof Loop) {
((Condition) node).getCondition().setExpectedType(BuiltinTypes.Boolean);
if (node instanceof Condition) { Condition condNode = (Condition) node; Expression condition = condNode.getCondition(); if (Nodes.isEquivalent(expr, condition)) { int priority = 0; if (Nodes.isEmptyOrBreak(condNode.getTrueBlock())) { excluding = !excluding; priority = 10; check(expr, condNode.getTrueBlock(), mc, excluding); check(expr, condNode.getFalseBlock(), mc, excluding);