private void translateSwitchToBinarySearch(SwitchStatement statement, WasmExpression condition, WasmBlock initialWrapper, WasmBlock defaultTarget, WasmBlock[] targets) { List<TableEntry> entries = new ArrayList<>(); for (int i = 0; i < statement.getClauses().size(); i++) { SwitchClause clause = statement.getClauses().get(i); for (int label : clause.getConditions()) { entries.add(new TableEntry(label, targets[i])); } } entries.sort(Comparator.comparingInt(entry -> entry.label)); WasmLocal conditionVar = getTemporary(WasmType.INT32); initialWrapper.getBody().add(new WasmSetLocal(conditionVar, condition)); generateBinarySearch(entries, 0, entries.size() - 1, initialWrapper, defaultTarget, conditionVar); }
@Override public void visit(SwitchStatement statement) { outerStatements.add(statement); for (SwitchClause clause : statement.getClauses()) { processSequence(clause.getBody()); } processSequence(statement.getDefaultClause()); outerStatements.remove(statement); }
@Override public void visit(SwitchStatement statement) { try { output.writeByte(4); writeNullableString(statement.getId()); writeExpr(statement.getValue()); output.writeShort(statement.getClauses().size()); for (SwitchClause clause : statement.getClauses()) { int[] conditions = clause.getConditions(); output.writeShort(conditions.length); for (int condition : conditions) { output.writeInt(condition); } writeSequence(clause.getBody()); } writeSequence(statement.getDefaultClause()); } catch (IOException e) { throw new IOExceptionWrapper(e); } }
@Override public void visit(SwitchStatement statement) { IdentifiedStatement currentBlockBackup = currentBlock; currentBlock = statement; for (SwitchClause clause : statement.getClauses()) { visit(clause.getBody()); } visit(statement.getDefaultClause()); if (!hasRefs.contains(currentBlock)) { currentBlock.setId(null); } currentBlock = currentBlockBackup; }
@Override public void visit(SwitchStatement statement) { IdentifiedStatement oldCurrentBlock = currentBlock; currentBlock = statement; for (SwitchClause clause : statement.getClauses()) { visit(clause.getBody()); } visit(statement.getDefaultClause()); currentBlock = oldCurrentBlock; if (last && blocksCount.containsKey(statement)) { incrementCurrentBlock(); } }
@Override public void visit(SwitchStatement statement) { handleList(statement.getDefaultClause()); for (SwitchClause clause : statement.getClauses()) { handleList(clause.getBody()); } }
private void translateSwitchToWasmSwitch(SwitchStatement statement, WasmExpression condition, WasmBlock initialWrapper, WasmBlock defaultTarget, WasmBlock[] targets, int min, int max) { if (min != 0) { condition = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.SUB, condition, new WasmInt32Constant(min)); } WasmSwitch wasmSwitch = new WasmSwitch(condition, initialWrapper); initialWrapper.getBody().add(wasmSwitch); wasmSwitch.setDefaultTarget(defaultTarget); WasmBlock[] expandedTargets = new WasmBlock[max - min + 1]; for (int i = 0; i < statement.getClauses().size(); i++) { SwitchClause clause = statement.getClauses().get(i); for (int label : clause.getConditions()) { expandedTargets[label - min] = targets[i]; } } for (WasmBlock target : expandedTargets) { wasmSwitch.getTargets().add(target != null ? target : wasmSwitch.getDefaultTarget()); } }
@Override public void visit(SwitchStatement statement) { if (tryCatchFound) { return; } for (SwitchClause clause : statement.getClauses()) { visitSequence(clause.getBody()); if (tryCatchFound) { return; } } visitSequence(statement.getDefaultClause()); }
@Override public void visit(SwitchStatement statement) { statement.getValue().acceptVisitor(this); statement.setValue(resultExpr); for (SwitchClause clause : statement.getClauses()) { List<Statement> newBody = processSequence(clause.getBody()); clause.getBody().clear(); clause.getBody().addAll(newBody); } List<Statement> newDefault = processSequence(statement.getDefaultClause()); statement.getDefaultClause().clear(); statement.getDefaultClause().addAll(newDefault); if (statement.getClauses().isEmpty()) { SequentialStatement seq = new SequentialStatement(); seq.getSequence().addAll(statement.getDefaultClause()); resultStmt = seq; } else { resultStmt = statement; } }
@Override public void visit(SwitchStatement statement) { int min = statement.getClauses().stream() .flatMapToInt(clause -> Arrays.stream(clause.getConditions())) .min().orElse(0); int max = statement.getClauses().stream() .flatMapToInt(clause -> Arrays.stream(clause.getConditions())) .max().orElse(0); WasmBlock initialWrapper = wrapper; List<SwitchClause> clauses = statement.getClauses(); WasmBlock[] targets = new WasmBlock[clauses.size()]; for (int i = 0; i < clauses.size(); i++) {
clause.getBody().add(jumpStmt); stmt.getClauses().add(clause);
@Override public void visit(SwitchStatement statement) { if (blockCountVisitor.getCount(statement) > 0) { escaping = true; return; } for (SwitchClause clause : statement.getClauses()) { if (check(clause.getBody())) { break; } } if (!escaping) { check(statement.getDefaultClause()); } }
@Override public void visit(SwitchStatement statement) { statement.getValue().acceptVisitor(this); for (SwitchClause clause : statement.getClauses()) { visit(clause.getBody()); } visit(statement.getDefaultClause()); }
} else if (stmt instanceof SwitchStatement) { SwitchStatement switchStmt = (SwitchStatement) stmt; for (SwitchClause clause : switchStmt.getClauses()) { eliminateRedundantBreaks(clause.getBody(), null);
@Override public void visit(SwitchStatement statement) { writer.print("switch ("); statement.getValue().acceptVisitor(this); writer.print(") {").println().indent(); for (SwitchClause clause : statement.getClauses()) { for (int condition : clause.getConditions()) { writer.println("case " + condition + ":"); } writer.indent(); visitMany(clause.getBody()); writer.println("break;"); writer.outdent(); } if (!statement.getDefaultClause().isEmpty()) { writer.println("default:").indent(); visitMany(statement.getDefaultClause()); writer.outdent(); } writer.outdent().println("}"); if (statement.getId() != null) { writer.outdent().println("label_" + statement.getId() + ":;").indent(); } }
stmt.getClauses().add(clause);
for (SwitchClause clause : statement.getClauses()) { for (int condition : clause.getConditions()) { writer.append("case ").append(condition).append(":").softNewLine();
@Override public void visit(SwitchStatement statement) { outerStatements.add(statement); for (SwitchClause clause : statement.getClauses()) { processSequence(clause.getBody()); } processSequence(statement.getDefaultClause()); outerStatements.remove(statement); }
@Override public void visit(SwitchStatement statement) { handleList(statement.getDefaultClause()); for (SwitchClause clause : statement.getClauses()) { handleList(clause.getBody()); } }
@Override public void visit(SwitchStatement statement) { statement.getValue().acceptVisitor(this); for (SwitchClause clause : statement.getClauses()) { visit(clause.getBody()); } visit(statement.getDefaultClause()); }