@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); resultStmt = statement; }
@Override public void visit(SwitchInstruction insn) { SwitchStatement stmt = new SwitchStatement(); stmt.setId("sblock" + (lastSwitchId++)); stmt.setValue(Expr.var(insn.getCondition().getIndex())); Map<Integer, List<Integer>> switchMap = new HashMap<>(); for (int i = 0; i < insn.getEntries().size(); ++i) { SwitchTableEntry entry = insn.getEntries().get(i); List<Integer> conditions = switchMap.get(entry.getTarget().getIndex()); if (conditions == null) { conditions = new ArrayList<>(); switchMap.put(entry.getTarget().getIndex(), conditions); } conditions.add(entry.getCondition()); } List<Integer> targets = new ArrayList<>(switchMap.keySet()); Collections.sort(targets); for (int target : targets) { SwitchClause clause = new SwitchClause(); List<Integer> conditionList = switchMap.get(target); int[] conditions = new int[conditionList.size()]; for (int i = 0; i < conditionList.size(); ++i) { conditions[i] = conditionList.get(i); } clause.setConditions(conditions); Statement jumpStmt = generateJumpStatement(stmt, target); if (jumpStmt != null) { clause.getBody().add(jumpStmt); } stmt.getClauses().add(clause); } Statement breakStmt = generateJumpStatement(insn.getDefaultTarget()); if (breakStmt != null) { stmt.getDefaultClause().add(breakStmt); } statements.add(stmt); }