@Override public ExprCaseLabel clone() { return new ExprCaseLabel(expr.clone()); }
private List<Stmt> generateUnreachableSwitchContent(int numCases, List<Integer> usedLabels, Fuzzer stmtFuzzer, IRandom generator) { List<Stmt> stmts = new ArrayList<>(); for (int i = 0; i < numCases; i++) { Integer caseLabel = getCaseLabel(usedLabels, generator); final Stmt fuzzedStmt = stmtFuzzer.fuzzStmt(); stmts.add(new ExprCaseLabel( new IntConstantExpr(caseLabel.toString()))); stmts.add(fuzzedStmt); } return stmts; }
private List<Stmt> generateReachableSwitchCases(BlockStmt block, int numCases, List<Integer> usedLabels, IRandom generator) { // Index i of this list stores the case labels to appear before statement i List<List<Integer>> stmtIndexToCaseLabels = new ArrayList<>(); // Initially make the label sets empty for (int i = 0; i < block.getNumStmts(); i++) { stmtIndexToCaseLabels.add(new ArrayList<>()); } // Label 0, which is what we should actually jump to, is the first label. stmtIndexToCaseLabels.get(0).add(0); for (int i = 0; i < numCases; i++) { stmtIndexToCaseLabels.get(generator.nextInt(block.getNumStmts())) .add(getCaseLabel(usedLabels, generator)); } List<Stmt> result = new ArrayList<>(); for (int i = 0; i < block.getNumStmts(); i++) { result.addAll(stmtIndexToCaseLabels.get(i) .stream().map(item -> new ExprCaseLabel(new IntConstantExpr(item.toString()))) .collect(Collectors.toList())); result.add(block.getStmt(i)); } result.add(BreakStmt.INSTANCE); return result; }
@Override public CaseLabel visitCase_label(Case_labelContext ctx) { if (ctx.DEFAULT() != null) { return DefaultCaseLabel.INSTANCE; } return new ExprCaseLabel(visitExpression(ctx.expression())); }