diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2019-03-14 13:54:13 +0100 |
---|---|---|
committer | Marc R. Hoffmann <hoffmann@mountainminds.com> | 2019-03-14 13:54:13 +0100 |
commit | 795c8f9e3b2e7e7abe3f4342bbd4a1dd31530325 (patch) | |
tree | 04635a92dadc4309ede496204eec963249e7b5e0 /org.jacoco.core | |
parent | 771812b48fe8542b89ea66e82ca4b391a130c2b2 (diff) | |
download | jacoco-795c8f9e3b2e7e7abe3f4342bbd4a1dd31530325.tar.gz |
`nextIsInvokeStatic` and `nextIsInvokeVirtual` should check method descriptor (#857)
Diffstat (limited to 'org.jacoco.core')
14 files changed, 47 insertions, 62 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java index c27c4e92..38860a83 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java @@ -57,49 +57,19 @@ abstract class AbstractMatcher { } /** - * Moves {@link #cursor} to next instruction if it is - * <code>INVOKESPECIAL <init></code> with given owner and descriptor, - * otherwise sets it to <code>null</code>. - */ - final void nextIsInvokeSuper(final String owner, final String desc) { - nextIs(Opcodes.INVOKESPECIAL); - MethodInsnNode m = (MethodInsnNode) cursor; - if (m != null && owner.equals(m.owner) && "<init>".equals(m.name) - && desc.equals(m.desc)) { - return; - } - cursor = null; - } - - /** - * Moves {@link #cursor} to next instruction if it is - * <code>INVOKEVIRTUAL</code> with given owner and name, otherwise sets it - * to <code>null</code>. - */ - final void nextIsInvokeVirtual(final String owner, final String name) { - nextIs(Opcodes.INVOKEVIRTUAL); - if (cursor == null) { - return; - } - final MethodInsnNode m = (MethodInsnNode) cursor; - if (owner.equals(m.owner) && name.equals(m.name)) { - return; - } - cursor = null; - } - - /** - * Moves {@link #cursor} to next instruction if it is - * <code>INVOKESTATIC</code> with given owner and name, otherwise sets it to + * Moves {@link #cursor} to next instruction if it is {@link MethodInsnNode} + * with given opcode, owner, name and descriptor, otherwise sets it to * <code>null</code>. */ - final void nextIsInvokeStatic(final String owner, final String name) { - nextIs(Opcodes.INVOKESTATIC); + final void nextIsInvoke(final int opcode, final String owner, + final String name, final String descriptor) { + nextIs(opcode); if (cursor == null) { return; } final MethodInsnNode m = (MethodInsnNode) cursor; - if (owner.equals(m.owner) && name.equals(m.name)) { + if (owner.equals(m.owner) && name.equals(m.name) + && descriptor.equals(m.desc)) { return; } cursor = null; diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumEmptyConstructorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumEmptyConstructorFilter.java index 8b7096a9..4a39d1e8 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumEmptyConstructorFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumEmptyConstructorFilter.java @@ -51,7 +51,8 @@ public final class EnumEmptyConstructorFilter implements IFilter { firstIsALoad0(methodNode); nextIs(Opcodes.ALOAD); nextIs(Opcodes.ILOAD); - nextIsInvokeSuper(ENUM_TYPE, CONSTRUCTOR_DESC); + nextIsInvoke(Opcodes.INVOKESPECIAL, ENUM_TYPE, CONSTRUCTOR_NAME, + CONSTRUCTOR_DESC); nextIs(Opcodes.RETURN); return cursor != null; } diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java index 2e381325..66d450a3 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java @@ -49,16 +49,18 @@ public final class KotlinCoroutineFilter implements IFilter { private void match(final MethodNode methodNode, final IFilterOutput output) { cursor = methodNode.instructions.getFirst(); - nextIsInvokeStatic("kotlin/coroutines/intrinsics/IntrinsicsKt", - "getCOROUTINE_SUSPENDED"); + nextIsInvoke(Opcodes.INVOKESTATIC, + "kotlin/coroutines/intrinsics/IntrinsicsKt", + "getCOROUTINE_SUSPENDED", "()Ljava/lang/Object;"); if (cursor == null) { cursor = skipNonOpcodes(methodNode.instructions.getFirst()); nextIsCreateStateInstance(); - nextIsInvokeStatic("kotlin/coroutines/intrinsics/IntrinsicsKt", - "getCOROUTINE_SUSPENDED"); + nextIsInvoke(Opcodes.INVOKESTATIC, + "kotlin/coroutines/intrinsics/IntrinsicsKt", + "getCOROUTINE_SUSPENDED", "()Ljava/lang/Object;"); } nextIsVar(Opcodes.ASTORE, "COROUTINE_SUSPENDED"); @@ -127,7 +129,8 @@ public final class KotlinCoroutineFilter implements IFilter { "call to 'resume' before 'invoke' with coroutine")) { return; } - nextIsInvokeSuper("java/lang/IllegalStateException", + nextIsInvoke(Opcodes.INVOKESPECIAL, + "java/lang/IllegalStateException", "<init>", "(Ljava/lang/String;)V"); nextIs(Opcodes.ATHROW); if (cursor == null) { @@ -142,7 +145,8 @@ public final class KotlinCoroutineFilter implements IFilter { private void nextIsThrowOnFailure() { final AbstractInsnNode c = cursor; - nextIsInvokeStatic("kotlin/ResultKt", "throwOnFailure"); + nextIsInvoke(Opcodes.INVOKESTATIC, "kotlin/ResultKt", + "throwOnFailure", "(Ljava/lang/Object;)V"); if (cursor == null) { cursor = c; // Before resolution of diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinLateinitFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinLateinitFilter.java index 44805984..12fe926c 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinLateinitFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinLateinitFilter.java @@ -21,9 +21,6 @@ import org.objectweb.asm.tree.MethodNode; */ public class KotlinLateinitFilter implements IFilter { - private final static String OWNER = "kotlin/jvm/internal/Intrinsics"; - private final static String NAME = "throwUninitializedPropertyAccessException"; - public void filter(final MethodNode methodNode, final IFilterContext context, final IFilterOutput output) { final Matcher matcher = new Matcher(); @@ -43,7 +40,9 @@ public class KotlinLateinitFilter implements IFilter { cursor = start; nextIs(Opcodes.LDC); - nextIsInvokeStatic(OWNER, NAME); + nextIsInvoke(Opcodes.INVOKESTATIC, "kotlin/jvm/internal/Intrinsics", + "throwUninitializedPropertyAccessException", + "(Ljava/lang/String;)V"); if (cursor != null) { output.ignore(start, cursor); diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinNotNullOperatorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinNotNullOperatorFilter.java index a5a1b5d5..4dd223a3 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinNotNullOperatorFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinNotNullOperatorFilter.java @@ -37,7 +37,8 @@ public final class KotlinNotNullOperatorFilter implements IFilter { return; } cursor = start; - nextIsInvokeStatic("kotlin/jvm/internal/Intrinsics", "throwNpe"); + nextIsInvoke(Opcodes.INVOKESTATIC, "kotlin/jvm/internal/Intrinsics", + "throwNpe", "()V"); if (cursor == null) { return; } diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java index 97b6835f..c298e945 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java @@ -54,8 +54,8 @@ public final class KotlinUnsafeCastOperatorFilter implements IFilter { .startsWith("null cannot be cast to non-null type"))) { return; } - nextIsInvokeSuper(KOTLIN_TYPE_CAST_EXCEPTION, - "(Ljava/lang/String;)V"); + nextIsInvoke(Opcodes.INVOKESPECIAL, KOTLIN_TYPE_CAST_EXCEPTION, + "<init>", "(Ljava/lang/String;)V"); nextIs(Opcodes.ATHROW); if (cursor == null) { return; diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenFilter.java index 54931669..a229aa04 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenFilter.java @@ -52,7 +52,7 @@ public final class KotlinWhenFilter implements IFilter { nextIsType(Opcodes.NEW, EXCEPTION); nextIs(Opcodes.DUP); - nextIsInvokeSuper(EXCEPTION, "()V"); + nextIsInvoke(Opcodes.INVOKESPECIAL, EXCEPTION, "<init>", "()V"); nextIs(Opcodes.ATHROW); for (AbstractInsnNode i = cursor; i != null; i = i.getPrevious()) { diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java index 497b4b52..fcccb550 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java @@ -46,7 +46,8 @@ public final class KotlinWhenStringFilter implements IFilter { return; } cursor = start; - nextIsInvokeVirtual("java/lang/String", "hashCode"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", "hashCode", + "()I"); nextIsSwitch(); if (cursor == null) { return; @@ -73,7 +74,8 @@ public final class KotlinWhenStringFilter implements IFilter { while (true) { nextIsVar(Opcodes.ALOAD, "s"); nextIs(Opcodes.LDC); - nextIsInvokeVirtual("java/lang/String", "equals"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", + "equals", "(Ljava/lang/Object;)Z"); // jump to next comparison or default case nextIs(Opcodes.IFEQ); final JumpInsnNode jump = (JumpInsnNode) cursor; diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java index 5406aa36..236ef712 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java @@ -37,7 +37,8 @@ public final class PrivateEmptyNoArgConstructorFilter implements IFilter { private boolean match(final MethodNode methodNode, final String superClassName) { firstIsALoad0(methodNode); - nextIsInvokeSuper(superClassName, CONSTRUCTOR_DESC); + nextIsInvoke(Opcodes.INVOKESPECIAL, superClassName, + CONSTRUCTOR_NAME, CONSTRUCTOR_DESC); nextIs(Opcodes.RETURN); return cursor != null; } diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchEcjFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchEcjFilter.java index b0306662..e0aba35d 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchEcjFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchEcjFilter.java @@ -46,7 +46,8 @@ public final class StringSwitchEcjFilter implements IFilter { return; } cursor = start; - nextIsInvokeVirtual("java/lang/String", "hashCode"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", "hashCode", + "()I"); nextIsSwitch(); if (cursor == null) { return; @@ -73,7 +74,8 @@ public final class StringSwitchEcjFilter implements IFilter { while (true) { nextIsVar(Opcodes.ALOAD, "s"); nextIs(Opcodes.LDC); - nextIsInvokeVirtual("java/lang/String", "equals"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", + "equals", "(Ljava/lang/Object;)Z"); // jump to case nextIs(Opcodes.IFNE); if (cursor == null) { diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilter.java index 36421ee4..3033d9bc 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/StringSwitchJavacFilter.java @@ -68,12 +68,14 @@ public final class StringSwitchJavacFilter implements IFilter { // Even if expression is not a variable, its result will be // precomputed before the previous two instructions: nextIsVar(Opcodes.ALOAD, "s"); - nextIsInvokeVirtual("java/lang/String", "hashCode"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", "hashCode", + "()I"); next(); while (true) { nextIsVar(Opcodes.ALOAD, "s"); nextIs(Opcodes.LDC); - nextIsInvokeVirtual("java/lang/String", "equals"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/String", + "equals", "(Ljava/lang/Object;)Z"); // jump to next comparison or second switch nextIs(Opcodes.IFEQ); // ICONST, BIPUSH or SIPUSH diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java index 158799f6..94dea561 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesEcjFilter.java @@ -200,7 +200,8 @@ public final class TryWithResourcesEcjFilter implements IFilter { // "primaryExc.addSuppressed(suppressedExc)" nextIsVar(Opcodes.ALOAD, "primaryExc"); nextIsVar(Opcodes.ALOAD, suppressedExc); - nextIsInvokeVirtual("java/lang/Throwable", "addSuppressed"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", + "addSuppressed", "(Ljava/lang/Throwable;)V"); nextIsLabel(endLabel); return cursor != null; } diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavac11Filter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavac11Filter.java index 464031a5..7a20f74f 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavac11Filter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavac11Filter.java @@ -77,7 +77,8 @@ public final class TryWithResourcesJavac11Filter implements IFilter { nextIsVar(Opcodes.ASTORE, "t"); nextIsVar(Opcodes.ALOAD, "primaryExc"); nextIsVar(Opcodes.ALOAD, "t"); - nextIsInvokeVirtual("java/lang/Throwable", "addSuppressed"); // primaryExc.addSuppressed(t) + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", + "addSuppressed", "(Ljava/lang/Throwable;)V"); // primaryExc.addSuppressed(t) nextIsVar(Opcodes.ALOAD, "primaryExc"); nextIs(Opcodes.ATHROW); if (cursor == null) { diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java index e6762d6b..23ecb0e6 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/TryWithResourcesJavacFilter.java @@ -216,7 +216,8 @@ public final class TryWithResourcesJavacFilter implements IFilter { // "primaryExc.addSuppressed(t)" nextIsVar(Opcodes.ALOAD, "primaryExc"); nextIsVar(Opcodes.ALOAD, ctx + "t"); - nextIsInvokeVirtual("java/lang/Throwable", "addSuppressed"); + nextIsInvoke(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", + "addSuppressed", "(Ljava/lang/Throwable;)V"); nextIs(Opcodes.GOTO); // "r.close()" nextIsClose(); |