private boolean hitsRedundantBreakThreshold(List<Statement> statements, IdentifiedStatement exit) { int count = 0; for (int i = 0; i < statements.size(); ++i) { Statement stmt = statements.get(i); if (!(stmt instanceof ConditionalStatement)) { continue; } ConditionalStatement conditional = (ConditionalStatement) stmt; if (!conditional.getConsequent().isEmpty() && !conditional.getAlternative().isEmpty()) { continue; } List<Statement> innerStatements = !conditional.getConsequent().isEmpty() ? conditional.getConsequent() : conditional.getAlternative(); if (innerStatements.isEmpty()) { continue; } Statement last = innerStatements.get(innerStatements.size() - 1); if (!(last instanceof BreakStatement)) { continue; } BreakStatement breakStmt = (BreakStatement) last; if (exit != null && exit == breakStmt.getTarget() && ++count == 8) { return true; } } return false; }
private void normalizeConditional(ConditionalStatement stmt) { if (stmt.getConsequent().isEmpty()) { stmt.getConsequent().addAll(stmt.getAlternative()); stmt.getAlternative().clear(); stmt.setCondition(ExprOptimizer.invert(stmt.getCondition())); } }
public static Statement cond(Expr predicate, List<Statement> consequent, List<Statement> alternative) { ConditionalStatement statement = new ConditionalStatement(); statement.setCondition(predicate); statement.getConsequent().addAll(consequent); statement.getAlternative().addAll(alternative); return statement; }
@Override public void visit(ConditionalStatement statement) { processSequence(statement.getConsequent()); processSequence(statement.getAlternative()); }
@Override public void visit(ConditionalStatement statement) { if (tryCatchFound) { return; } visitSequence(statement.getConsequent()); visitSequence(statement.getAlternative()); }
@Override public void visit(ConditionalStatement statement) { if (!check(statement.getConsequent())) { check(statement.getAlternative()); } }
@Override public void visit(ConditionalStatement statement) { visit(statement.getConsequent()); visit(statement.getAlternative()); }
@Override public void visit(ConditionalStatement statement) { handleList(statement.getConsequent()); handleList(statement.getAlternative()); }
ConditionalStatement cond = (ConditionalStatement) stmt; check_conditional: if (shouldOptimizeBreaks) { last = cond.getConsequent().isEmpty() ? null : cond.getConsequent().get(cond.getConsequent().size() - 1); if (last instanceof BreakStatement) { BreakStatement breakStmt = (BreakStatement) last; if (exit != null && exit == breakStmt.getTarget()) { cond.getConsequent().remove(cond.getConsequent().size() - 1); List<Statement> remaining = statements.subList(i + 1, statements.size()); cond.getAlternative().addAll(remaining); cond.getAlternative().remove(cond.getAlternative().size() - 1); List<Statement> remaining = statements.subList(i + 1, statements.size()); cond.getConsequent().addAll(remaining); remaining.clear(); eliminateRedundantBreaks(cond.getConsequent(), exit); eliminateRedundantBreaks(cond.getAlternative(), exit); if (cond.getConsequent().size() == 1 && cond.getConsequent().get(0) instanceof ConditionalStatement) { ConditionalStatement innerCond = (ConditionalStatement) cond.getConsequent().get(0); if (innerCond.getAlternative().isEmpty()) { if (cond.getAlternative().isEmpty()) { cond.getConsequent().clear(); cond.getConsequent().addAll(innerCond.getConsequent()); cond.setCondition(Expr.binary(BinaryOperation.AND, null, cond.getCondition(), innerCond.getCondition(), cond.getCondition().getLocation())); || !(cond.getAlternative().get(0) instanceof ConditionalStatement)) {
@Override public void visit(ConditionalStatement statement) { try { output.writeByte(3); writeExpr(statement.getCondition()); writeSequence(statement.getConsequent()); writeSequence(statement.getAlternative()); } catch (IOException e) { throw new IOExceptionWrapper(e); } }
@Override public void visit(ConditionalStatement statement) { statement.getCondition().acceptVisitor(this); statement.setCondition(optimizeCondition(resultExpr)); List<Statement> consequent = processSequence(statement.getConsequent()); List<Statement> alternative = processSequence(statement.getAlternative()); if (consequent.isEmpty()) { consequent.addAll(alternative); alternative.clear(); statement.setCondition(ExprOptimizer.invert(statement.getCondition())); } if (consequent.isEmpty()) { SequentialStatement sequentialStatement = new SequentialStatement(); resultStmt = sequentialStatement; statement.getCondition().acceptVisitor(new ExpressionSideEffectDecomposer( sequentialStatement.getSequence())); return; } statement.getConsequent().clear(); statement.getConsequent().addAll(consequent); statement.getAlternative().clear(); statement.getAlternative().addAll(alternative); Statement asConditional = tryConvertToConditionalExpression(statement); if (asConditional != null) { asConditional.acceptVisitor(this); } else { resultStmt = statement; } }
@Override public void visit(ConditionalStatement statement) { statement.getCondition().acceptVisitor(this); visit(statement.getConsequent()); visit(statement.getAlternative()); }
if (!statement.getBody().isEmpty() && statement.getBody().get(0) instanceof ConditionalStatement) { ConditionalStatement cond = (ConditionalStatement) statement.getBody().get(0); if (cond.getConsequent().size() == 1 && cond.getConsequent().get(0) instanceof BreakStatement) { BreakStatement breakStmt = (BreakStatement) cond.getConsequent().get(0); if (breakStmt.getTarget() == statement) { statement.getBody().remove(0);
@Override public void visit(ConditionalStatement statement) { accept(statement.getCondition()); WasmConditional conditional = new WasmConditional(forCondition(result)); for (Statement part : statement.getConsequent()) { accept(part); if (result != null) { conditional.getThenBlock().getBody().add(result); } } for (Statement part : statement.getAlternative()) { accept(part); if (result != null) { conditional.getElseBlock().getBody().add(result); } } result = conditional; }
@Override public void visit(ConditionalExpr expr) { ConditionalStatement statement = new ConditionalStatement(); statement.setCondition(expr.getCondition()); expr.getCondition().acceptVisitor(new ExpressionSideEffectDecomposer(statement.getConsequent())); expr.getAlternative().acceptVisitor(new ExpressionSideEffectDecomposer(statement.getAlternative())); target.add(statement); } @Override
@Override public void visit(ConditionalStatement statement) { while (true) { writer.print("if ("); statement.getCondition().acceptVisitor(this); writer.println(") {").indent(); visitMany(statement.getConsequent()); writer.outdent().print("}"); if (statement.getAlternative().isEmpty()) { writer.println(); break; } writer.print(" else "); if (statement.getAlternative().size() == 1 && statement.getAlternative().get(0) instanceof ConditionalStatement) { statement = (ConditionalStatement) statement.getAlternative().get(0); } else { writer.println("{").indent(); visitMany(statement.getAlternative()); writer.outdent().println("}"); break; } } }
private Statement tryConvertToConditionalExpression(ConditionalStatement statement) { if (statement.getConsequent().size() != 1 || statement.getAlternative().size() != 1) { return null; Statement first = statement.getConsequent().get(0); Statement second = statement.getAlternative().get(0); if (!(first instanceof AssignmentStatement) || !(second instanceof AssignmentStatement)) {
visitStatements(statement.getConsequent()); if (!statement.getAlternative().isEmpty()) { writer.outdent().append("}").ws();
ConditionalStatement stmt = new ConditionalStatement(); stmt.setCondition(readExpr(input)); readSequence(input, stmt.getConsequent()); readSequence(input, stmt.getAlternative()); return stmt;
public static Statement cond(Expr predicate, List<Statement> consequent, List<Statement> alternative) { ConditionalStatement statement = new ConditionalStatement(); statement.setCondition(predicate); statement.getConsequent().addAll(consequent); statement.getAlternative().addAll(alternative); return statement; }