Example usage for org.objectweb.asm Opcodes NOP

List of usage examples for org.objectweb.asm Opcodes NOP

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes NOP.

Prototype

int NOP

To view the source code for org.objectweb.asm Opcodes NOP.

Click Source Link

Usage

From source file:org.jacoco.core.internal.analysis.filter.TryWithResourcesJavac11FilterTest.java

License:Open Source License

/**
 * <pre>//from   ww  w  . j a  v a 2s. c om
 *   try (r = new ...) {
 *     ...
 *   }
 * </pre>
 */
@Test
public void without_null_check() {
    final Range range1 = new Range();
    final Range range2 = new Range();

    final Label e = new Label();
    final Label t = new Label();

    final Label handler = new Label();
    m.visitTryCatchBlock(handler, handler, handler, "java/lang/Throwable");

    m.visitInsn(Opcodes.NOP);

    m.visitVarInsn(Opcodes.ALOAD, 0);
    range1.fromInclusive = m.instructions.getLast();
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Resource", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, e);
    range1.toInclusive = m.instructions.getLast();

    m.visitLabel(handler);
    range2.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 1);
    m.visitVarInsn(Opcodes.ALOAD, 0);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Resource", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, t);

    m.visitVarInsn(Opcodes.ASTORE, 2);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitLabel(t);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitInsn(Opcodes.ATHROW);
    range2.toInclusive = m.instructions.getLast();

    m.visitLabel(e);

    filter.filter(m, context, output);

    assertIgnored(range1, range2);
}

From source file:org.jacoco.core.internal.analysis.filter.TryWithResourcesJavac11FilterTest.java

License:Open Source License

/**
 * <pre>/*www  . j  av  a 2 s  . c o m*/
 *   try (r = open()) {
 *     ...
 *   }
 * </pre>
 */
@Test
public void with_null_check() {
    final Range range1 = new Range();
    final Range range2 = new Range();

    final Label e = new Label();
    final Label t = new Label();

    final Label handler = new Label();
    m.visitTryCatchBlock(handler, handler, handler, "java/lang/Throwable");

    m.visitInsn(Opcodes.NOP);

    m.visitVarInsn(Opcodes.ALOAD, 0);
    range1.fromInclusive = m.instructions.getLast();
    m.visitJumpInsn(Opcodes.IFNULL, e);
    m.visitVarInsn(Opcodes.ALOAD, 0);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Resource", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, e);
    range1.toInclusive = m.instructions.getLast();

    m.visitLabel(handler);
    range2.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 1);
    m.visitVarInsn(Opcodes.ALOAD, 0);
    m.visitJumpInsn(Opcodes.IFNULL, t);
    m.visitVarInsn(Opcodes.ALOAD, 0);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Resource", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, t);

    m.visitVarInsn(Opcodes.ASTORE, 2);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitLabel(t);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitInsn(Opcodes.ATHROW);
    range2.toInclusive = m.instructions.getLast();

    m.visitLabel(e);

    filter.filter(m, context, output);

    assertIgnored(range1, range2);
}

From source file:org.jacoco.core.internal.analysis.filter.TryWithResourcesJavacFilterTest.java

License:Open Source License

/**
 * javac 9 for//www .j av a  2s  .  c o  m
 *
 * <pre>
 *     try (r0 = open(...); r1 = new ...) {
 *         return ...
 *     } finally {
 *         ...
 *     }
 * </pre>
 *
 * generates
 *
 * <pre>
 *     ...
 *     ASTORE r0
 *     ACONST_NULL
 *     ASTORE primaryExc0
 *
 *     ...
 *     ASTORE r1
 *     ACONST_NULL
 *     ASTORE primaryExc1
 *
 *     ... // body
 *
 *     ALOAD primaryExc1
 *     ALOAD r1
 *     INVOKESTATIC $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
 *
 *     ALOAD r0
 *     IFNULL n
 *     ALOAD primaryExc0
 *     ALOAD r0
 *     INVOKESTATIC $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
 *     n:
 *
 *     ... // finally on normal path
 *     ARETURN
 *
 *     ASTORE t
 *     ALOAD t
 *     ASTORE primaryExc1
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t
 *     ALOAD primaryExc1
 *     ALOAD r1
 *     INVOKESTATIC  $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t
 *     ALOAD t
 *     ASTORE primaryExc0
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t
 *     ALOAD r0
 *     IFNULL n
 *     ALOAD primaryExc0
 *     ALOAD r0
 *     INVOKESTATIC  $closeResource:(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
 *     n:
 *     ALOAD t
 *     ATHROW
 *
 *     ... // additional handlers for catch blocks and finally on exceptional path
 * </pre>
 */
@Test
public void javac9() {
    final Range range0 = new Range();
    final Range range1 = new Range();
    final Range range2 = new Range();
    final Range range3 = new Range();

    final Label handler1 = new Label();
    m.visitTryCatchBlock(handler1, handler1, handler1, "java/lang/Throwable");

    final Label handler2 = new Label();
    m.visitTryCatchBlock(handler2, handler2, handler2, "java/lang/Throwable");

    // r0 = open(...)
    m.visitVarInsn(Opcodes.ASTORE, 1);

    // primaryExc0 = null
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 2);

    // r1 = new ..
    m.visitVarInsn(Opcodes.ASTORE, 3);

    // primaryExc1 = null
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 4);

    // body
    m.visitInsn(Opcodes.NOP);
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 5);

    // $closeResource(primaryExc1, r1)
    m.visitVarInsn(Opcodes.ALOAD, 4);
    range0.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
            "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
    range0.toInclusive = m.instructions.getLast();

    // if (r0 != null)
    m.visitVarInsn(Opcodes.ALOAD, 1);
    range2.fromInclusive = m.instructions.getLast();
    final Label l11 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l11);
    // $closeResource(primaryExc0, r0)
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
            "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
    range2.toInclusive = m.instructions.getLast();
    m.visitLabel(l11);

    // finally
    m.visitInsn(Opcodes.NOP);
    m.visitVarInsn(Opcodes.ALOAD, 5);
    m.visitInsn(Opcodes.ARETURN);

    // catch (Throwable t)
    m.visitLabel(handler1);
    range1.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 5);
    // primaryExc1 = t
    m.visitVarInsn(Opcodes.ALOAD, 5);
    m.visitVarInsn(Opcodes.ASTORE, 4);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 5);
    m.visitInsn(Opcodes.ATHROW);

    // catch (any t)
    m.visitVarInsn(Opcodes.ASTORE, 6);
    // $closeResource(primaryExc1, r1)
    m.visitVarInsn(Opcodes.ALOAD, 4);
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
            "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
    m.visitVarInsn(Opcodes.ALOAD, 6);
    m.visitInsn(Opcodes.ATHROW);
    range1.toInclusive = m.instructions.getLast();

    // catch (Throwable t)
    m.visitLabel(handler2);
    range3.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 3);
    // primaryExc0 = t
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitVarInsn(Opcodes.ASTORE, 2);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitInsn(Opcodes.ATHROW);

    // catch (any t)
    m.visitVarInsn(Opcodes.ASTORE, 7);
    // if (r0 != null)
    m.visitVarInsn(Opcodes.ALOAD, 1);
    final Label l14 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l14);
    // $closeResource(primaryExc0, r0)
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKESTATIC, "Fun", "$closeResource",
            "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", false);
    m.visitLabel(l14);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 7);
    m.visitInsn(Opcodes.ATHROW);
    range3.toInclusive = m.instructions.getLast();

    m.visitVarInsn(Opcodes.ASTORE, 8);
    // finally
    m.visitInsn(Opcodes.NOP);
    m.visitVarInsn(Opcodes.ALOAD, 8);
    m.visitInsn(Opcodes.ATHROW);

    filter.filter(m, context, output);

    assertIgnored(range0, range1, range2, range3);
}

From source file:org.jacoco.core.internal.analysis.filter.TryWithResourcesJavacFilterTest.java

License:Open Source License

/**
 * javac 7 and 8 for/*  w  w w. jav a 2s. c om*/
 *
 * <pre>
 *     try (r0 = ...; r1 = ...) {
 *         return ...
 *     } finally {
 *         ...
 *     }
 * </pre>
 *
 * generate
 *
 * <pre>
 *     ...
 *     ASTORE r0
 *     ACONST_NULL
 *     ASTORE primaryExc0
 *
 *     ...
 *     ASTORE r1
 *     ACONST_NULL
 *     ASTORE primaryExc1
 *
 *     ... // body
 *
 *     ALOAD r1
 *     IFNULL n
 *     ALOAD primaryExc1
 *     IFNULL c
 *     ALOAD r1
 *     INVOKEINTERFACE close:()V
 *     GOTO n
 *     ASTORE t
 *     ALOAD primaryExc1
 *     ALOAD t
 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     GOTO n
 *     c:
 *     ALOAD r1
 *     INVOKEINTERFACE close:()V
 *     n:
 *
 *     ALOAD r0
 *     IFNULL n
 *     ALOAD primaryExc0
 *     IFNULL c
 *     ALOAD r0
 *     INVOKEVIRTUAL close:()V
 *     GOTO n
 *     ASTORE t
 *     ALOAD primaryExc0
 *     ALOAD t
 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     GOTO n
 *     c:
 *     ALOAD r0
 *     INVOKEVIRTUAL close:()V
 *     n:
 *
 *     ... // finally on normal path
 *     ARETURN
 *
 *     ASTORE t
 *     ALOAD t
 *     ASTORE primaryExc1
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t1
 *     ALOAD r1
 *     IFNULL e
 *     ALOAD primaryExc1
 *     IFNULL c
 *     ALOAD r1
 *     INVOKEINTERFACE close:()V
 *     GOTO e
 *     ASTORE t2
 *     ALOAD primaryExc1
 *     ALOAD t2
 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     GOTO e
 *     c:
 *     ALOAD r1
 *     INVOKEINTERFACE close:()V
 *     e:
 *     ALOAD t1
 *     ATHROW
 *
 *     ASTORE t
 *     ALOAD t
 *     ASTORE primaryExc0
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t1
 *     ALOAD r0
 *     IFNULL e
 *     ALOAD primaryExc0
 *     IFNULL c
 *     ALOAD r0
 *     INVOKEVIRTUAL close:()V
 *     GOTO e
 *     ASTORE t2
 *     ALOAD primaryExc0
 *     ALOAD t2
 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     GOTO e
 *     c:
 *     ALOAD r0
 *     INVOKEVIRTUAL close:()V
 *     e:
 *     ALOAD t1
 *     ATHROW
 *
 *     ... // additional handlers for catch blocks and finally on exceptional path
 * </pre>
 */
@Test
public void javac_7_8() {
    final Range range0 = new Range();
    final Range range1 = new Range();
    final Range range2 = new Range();
    final Range range3 = new Range();

    final Label handler1 = new Label();
    m.visitTryCatchBlock(handler1, handler1, handler1, "java/lang/Throwable");
    final Label handler2 = new Label();
    m.visitTryCatchBlock(handler2, handler2, handler2, "java/lang/Throwable");

    // r1 = ...
    m.visitVarInsn(Opcodes.ASTORE, 1);

    // primaryExc1 = null
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 2);

    // r2 = ...
    m.visitVarInsn(Opcodes.ASTORE, 3);
    // primaryExc2 = null
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 4);

    // body
    m.visitInsn(Opcodes.NOP);

    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 5);

    final Label l15 = new Label();
    // if (r2 != null)
    m.visitVarInsn(Opcodes.ALOAD, 3);
    range0.fromInclusive = m.instructions.getLast();
    m.visitJumpInsn(Opcodes.IFNULL, l15);
    // if (primaryExc2 != null)
    m.visitVarInsn(Opcodes.ALOAD, 4);
    final Label l26 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l26);
    // r2.close
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, l15);

    m.visitVarInsn(Opcodes.ASTORE, 6);
    m.visitVarInsn(Opcodes.ALOAD, 4);
    m.visitVarInsn(Opcodes.ALOAD, 6);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitJumpInsn(Opcodes.GOTO, l15);

    m.visitLabel(l26);

    // r2.close
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close", "()V", false);
    range0.toInclusive = m.instructions.getLast();
    m.visitLabel(l15);

    // if (r1 != null)
    m.visitVarInsn(Opcodes.ALOAD, 1);
    range2.fromInclusive = m.instructions.getLast();
    final Label l23 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l23);
    // if (primaryExc1 != null)
    m.visitVarInsn(Opcodes.ALOAD, 2);
    final Label l27 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l27);
    // r1.close
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, l23);

    m.visitVarInsn(Opcodes.ASTORE, 6);
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitVarInsn(Opcodes.ALOAD, 6);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitJumpInsn(Opcodes.GOTO, l23);

    m.visitLabel(l27);
    // r1.close
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close", "()V", false);
    range2.toInclusive = m.instructions.getLast();
    m.visitLabel(l23);

    // finally
    m.visitInsn(Opcodes.NOP);
    m.visitInsn(Opcodes.ARETURN);

    // catch (Throwable t)
    m.visitLabel(handler1);
    range1.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 5);
    // primaryExc2 = t
    m.visitVarInsn(Opcodes.ALOAD, 5);
    m.visitVarInsn(Opcodes.ASTORE, 4);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 5);
    m.visitInsn(Opcodes.ATHROW);

    // catch (any t)
    m.visitVarInsn(Opcodes.ASTORE, 7);
    // if (r2 != null)
    m.visitVarInsn(Opcodes.ALOAD, 3);
    final Label l28 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l28);
    // if (primaryExc2 != null)
    m.visitVarInsn(Opcodes.ALOAD, 4);
    final Label l29 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l29);
    // r2.close
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, l28);

    m.visitVarInsn(Opcodes.ASTORE, 8);
    m.visitVarInsn(Opcodes.ALOAD, 4);
    m.visitVarInsn(Opcodes.ALOAD, 8);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitJumpInsn(Opcodes.GOTO, l28);

    m.visitLabel(l29);
    // r2.close
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitMethodInsn(Opcodes.INVOKEINTERFACE, "Fun$Resource2", "close", "()V", false);
    m.visitLabel(l28);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 7);
    m.visitInsn(Opcodes.ATHROW);
    range1.toInclusive = m.instructions.getLast();

    // catch (Throwable t)
    m.visitLabel(handler2);
    range3.fromInclusive = m.instructions.getLast();
    m.visitVarInsn(Opcodes.ASTORE, 3);
    // primaryExc2 = t
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitVarInsn(Opcodes.ASTORE, 2);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 3);
    m.visitInsn(Opcodes.ATHROW);

    // catch (any t)
    m.visitVarInsn(Opcodes.ASTORE, 9);
    // if (r1 != null)
    m.visitVarInsn(Opcodes.ALOAD, 1);
    final Label l30 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l30);
    // if (primaryExc1 != null)
    m.visitVarInsn(Opcodes.ALOAD, 2);
    final Label l31 = new Label();
    m.visitJumpInsn(Opcodes.IFNULL, l31);
    // r1.close
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close", "()V", false);
    m.visitJumpInsn(Opcodes.GOTO, l30);

    m.visitVarInsn(Opcodes.ASTORE, 10);
    m.visitVarInsn(Opcodes.ALOAD, 2);
    m.visitVarInsn(Opcodes.ALOAD, 10);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V",
            false);
    m.visitJumpInsn(Opcodes.GOTO, l30);

    m.visitLabel(l31);
    // r1.close
    m.visitVarInsn(Opcodes.ALOAD, 1);
    m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Fun$Resource1", "close", "()V", false);
    m.visitLabel(l30);
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 9);
    m.visitInsn(Opcodes.ATHROW);
    range3.toInclusive = m.instructions.getLast();

    m.visitVarInsn(Opcodes.ASTORE, 11);
    // finally
    m.visitInsn(Opcodes.NOP);
    m.visitVarInsn(Opcodes.ALOAD, 11);
    m.visitInsn(Opcodes.ATHROW);

    filter.filter(m, context, output);

    assertIgnored(range0, range1, range2, range3);
}

From source file:org.jacoco.core.internal.analysis.filter.TryWithResourcesJavacFilterTest.java

License:Open Source License

/**
 * javac 9 for/*w w  w . j  ava 2s.c  om*/
 *
 * <pre>
 *     try (r = new ...) {
 *         ...
 *     } finally {
 *         ...
 *     }
 * </pre>
 *
 * generates
 *
 * <pre>
 *     ...
 *     ASTORE r
 *     ACONST_NULL
 *     ASTORE primaryExc
 *
 *     ... // body
 *
 *     ALOAD primaryExc
 *     IFNULL c
 *     ALOAD r
 *     INVOKEVIRTUAL close:()V
 *     GOTO f
 *     ASTORE t
 *     ALOAD primaryExc
 *     ALOAD t
 *     NVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     GOTO f
 *     c:
 *     ALOAD r
 *     INVOKEVIRTUAL close:()V
 *     GOTO f
 *
 *     ASTORE t
 *     ALOAD t
 *     ASTORE primaryExc
 *     ALOAD t
 *     ATHROW
 *
 *     ASTORE t
 *     ALOAD primaryExc
 *     IFNULL c
 *     ALOAD r
 *     INVOKEVIRTUAL close:()V
 *     GOTO L78
 *     ASTORE t2
 *     ALOAD primaryExc
 *     ALOAD t2
 *     INVOKEVIRTUAL java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
 *     goto e
 *     c:
 *     ALOAD r
 *     INVOKEVIRTUAL close:()V
 *     e:
 *     ALOAD t
 *     ATHROW
 *
 *     f:
 *     ... // finally on normal path
 *     ... // additional handlers for catch blocks and finally on exceptional path
 *     ...
 * </pre>
 */
@Test
public void javac9_omitted_null_check() {
    final Range range0 = new Range();
    final Range range1 = new Range();

    final Label handler = new Label();
    m.visitTryCatchBlock(handler, handler, handler, "java/lang/Throwable");

    // primaryExc = null
    m.visitInsn(Opcodes.ACONST_NULL);
    m.visitVarInsn(Opcodes.ASTORE, 1);

    // r = new ...
    m.visitInsn(Opcodes.NOP);

    final Label end = new Label();
    // "finally" on a normal path
    {
        // if (primaryExc != null)
        m.visitVarInsn(Opcodes.ALOAD, 2);
        range0.fromInclusive = m.instructions.getLast();
        final Label closeLabel = new Label();
        m.visitJumpInsn(Opcodes.IFNULL, closeLabel);
        // r.close
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V", false);
        m.visitJumpInsn(Opcodes.GOTO, end);

        // catch (Throwable t)
        m.visitVarInsn(Opcodes.ASTORE, 3);
        // primaryExc.addSuppressed(t)
        m.visitVarInsn(Opcodes.ALOAD, 2);
        m.visitVarInsn(Opcodes.ALOAD, 3);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed",
                "(Ljava/lang/Throwable;)V", false);
        m.visitJumpInsn(Opcodes.GOTO, end);

        m.visitLabel(closeLabel);
        // r.close()
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V", false);
    }
    m.visitJumpInsn(Opcodes.GOTO, end);
    range0.toInclusive = m.instructions.getLast();
    // catch (Throwable t)
    m.visitLabel(handler);
    {
        range1.fromInclusive = m.instructions.getLast();
        m.visitVarInsn(Opcodes.ASTORE, 3);
        // primaryExc = t
        m.visitVarInsn(Opcodes.ALOAD, 3);
        m.visitVarInsn(Opcodes.ASTORE, 2);
        // throw t
        m.visitVarInsn(Opcodes.ALOAD, 3);
        m.visitInsn(Opcodes.ATHROW);
    }
    // catch (any t)
    m.visitVarInsn(Opcodes.ASTORE, 4);
    // "finally" on exceptional path
    {
        // if (primaryExc != null)
        m.visitVarInsn(Opcodes.ALOAD, 2);
        final Label closeLabel = new Label();
        m.visitJumpInsn(Opcodes.IFNULL, closeLabel);
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V", false);
        final Label finallyEndLabel = new Label();
        m.visitJumpInsn(Opcodes.GOTO, finallyEndLabel);

        // catch (Throwable t)
        m.visitVarInsn(Opcodes.ASTORE, 5);
        // primaryExc.addSuppressed(t)
        m.visitVarInsn(Opcodes.ALOAD, 2);
        m.visitVarInsn(Opcodes.ALOAD, 5);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed",
                "(Ljava/lang/Throwable;)V", false);
        m.visitJumpInsn(Opcodes.GOTO, finallyEndLabel);

        m.visitLabel(closeLabel);
        // r.close()
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "Resource", "close", "()V", false);
        m.visitLabel(finallyEndLabel);
    }
    // throw t
    m.visitVarInsn(Opcodes.ALOAD, 4);
    m.visitInsn(Opcodes.ATHROW);
    range1.toInclusive = m.instructions.getLast();

    m.visitLabel(end);

    filter.filter(m, context, output);

    assertIgnored(range0, range1);
}

From source file:org.jacoco.core.internal.analysis.InstructionsBuilderTest.java

License:Open Source License

@Test
public void current_line_number_should_be_applied_to_instructions() {
    InsnNode i1 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i1);/* w  ww.jav a 2s . c  o m*/

    builder.setCurrentLine(10);
    InsnNode i2 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i2);
    InsnNode i3 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i3);

    builder.setCurrentLine(20);
    InsnNode i4 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i4);

    Map<AbstractInsnNode, Instruction> map = builder.getInstructions();
    assertEquals(ISourceNode.UNKNOWN_LINE, map.get(i1).getLine());
    assertEquals(10, map.get(i2).getLine());
    assertEquals(10, map.get(i3).getLine());
    assertEquals(20, map.get(i4).getLine());
}

From source file:org.jacoco.core.internal.analysis.InstructionsBuilderTest.java

License:Open Source License

@Test
public void null_probearray_should_not_mark_instruction_as_covered() {
    builder = new InstructionsBuilder(null);

    InsnNode i1 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i1);//  w w w. j a v a  2s.c  o  m
    builder.addProbe(5, 0);

    Map<AbstractInsnNode, Instruction> map = builder.getInstructions();
    assertEquals(CounterImpl.COUNTER_1_0, map.get(i1).getInstructionCounter());
}

From source file:org.jacoco.core.internal.analysis.InstructionsBuilderTest.java

License:Open Source License

@Test
public void unexecuted_probe_should_not_mark_instruction_as_covered() {
    InsnNode i1 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i1);//w ww .j a va  2s.c o  m
    builder.addProbe(0, 0);

    Map<AbstractInsnNode, Instruction> map = builder.getInstructions();
    assertEquals(CounterImpl.COUNTER_1_0, map.get(i1).getInstructionCounter());
}

From source file:org.jacoco.core.internal.analysis.InstructionsBuilderTest.java

License:Open Source License

@Test
public void executed_probe_should_mark_instruction_as_covered() {
    InsnNode i1 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i1);/*  w  w  w  .  j ava  2  s . c  o  m*/
    builder.addProbe(1, 0);

    Map<AbstractInsnNode, Instruction> map = builder.getInstructions();
    assertEquals(CounterImpl.COUNTER_0_1, map.get(i1).getInstructionCounter());
}

From source file:org.jacoco.core.internal.analysis.InstructionsBuilderTest.java

License:Open Source License

@Test
public void subsequent_instructions_should_be_linked_by_default() {
    InsnNode i1 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i1);/*from w  ww.  jav a  2  s  .co  m*/

    InsnNode i2 = new InsnNode(Opcodes.NOP);
    builder.addInstruction(i2);

    // mark i2 as covered
    builder.addProbe(1, 0);

    // coverage should be propagated to i1
    Map<AbstractInsnNode, Instruction> map = builder.getInstructions();
    assertEquals(CounterImpl.COUNTER_0_1, map.get(i1).getInstructionCounter());
}