use of org.objectweb.asm.Opcodes.NOP in project sonar-java by SonarSource.
the class BytecodeCFGBuilderTest method all_opcodes_should_be_visited.
@Test
public void all_opcodes_should_be_visited() throws Exception {
Instructions ins = new Instructions();
Predicate<Integer> filterReturnAndThrow = opcode -> !((Opcodes.IRETURN <= opcode && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW);
NO_OPERAND_INSN.stream().filter(filterReturnAndThrow).forEach(ins::visitInsn);
INT_INSN.forEach(i -> ins.visitIntInsn(i, 0));
VAR_INSN.forEach(i -> ins.visitVarInsn(i, 0));
TYPE_INSN.forEach(i -> ins.visitTypeInsn(i, "java/lang/Object"));
FIELD_INSN.forEach(i -> ins.visitFieldInsn(i, "java/lang/Object", "foo", "D(D)"));
METHOD_INSN.forEach(i -> ins.visitMethodInsn(i, "java/lang/Object", "foo", "()V", i == INVOKEINTERFACE));
JUMP_INSN.forEach(i -> {
Label jumpLabel = new Label();
ins.visitJumpInsn(i, jumpLabel);
ins.visitLabel(jumpLabel);
});
ins.visitLdcInsn("a");
ins.visitIincInsn(0, 1);
Handle handle = new Handle(H_INVOKESTATIC, "", "", "()V", false);
ins.visitInvokeDynamicInsn("sleep", "()V", handle);
ins.visitLookupSwitchInsn(new Label(), new int[] {}, new Label[] {});
ins.visitMultiANewArrayInsn("B", 1);
Label l0 = new Label();
Label dflt = new Label();
Label case0 = new Label();
ins.visitTableSwitchInsn(0, 1, dflt, case0);
ins.visitLabel(dflt);
ins.visitInsn(NOP);
ins.visitLabel(l0);
ins.visitInsn(NOP);
BytecodeCFG cfg = ins.cfg();
Multiset<String> cfgOpcodes = cfgOpcodes(cfg);
List<String> collect = Instructions.ASM_OPCODES.stream().filter(filterReturnAndThrow).map(op -> Printer.OPCODES[op]).collect(Collectors.toList());
assertThat(cfgOpcodes).containsAll(collect);
}
Aggregations