diff options
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal/analysis')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java | 34 |
1 files changed, 20 insertions, 14 deletions
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 b1d448af..e2bed498 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 @@ -73,13 +73,7 @@ public final class KotlinCoroutineFilter implements IFilter { s.labels.size() * 2); nextIs(Opcodes.ALOAD); - nextIs(Opcodes.DUP); - nextIsType(Opcodes.INSTANCEOF, "kotlin/Result$Failure"); - nextIs(Opcodes.IFEQ); - nextIsType(Opcodes.CHECKCAST, "kotlin/Result$Failure"); - nextIs(Opcodes.GETFIELD); - nextIs(Opcodes.ATHROW); - nextIs(Opcodes.POP); + nextIsThrowOnFailure(); if (cursor == null) { return; @@ -109,13 +103,7 @@ public final class KotlinCoroutineFilter implements IFilter { for (AbstractInsnNode j = i; j != null; j = j.getNext()) { cursor = j; nextIs(Opcodes.ALOAD); - nextIs(Opcodes.DUP); - nextIsType(Opcodes.INSTANCEOF, "kotlin/Result$Failure"); - nextIs(Opcodes.IFEQ); - nextIsType(Opcodes.CHECKCAST, "kotlin/Result$Failure"); - nextIs(Opcodes.GETFIELD); - nextIs(Opcodes.ATHROW); - nextIs(Opcodes.POP); + nextIsThrowOnFailure(); nextIs(Opcodes.ALOAD); if (cursor != null && skipNonOpcodes(cursor @@ -149,6 +137,24 @@ public final class KotlinCoroutineFilter implements IFilter { } } + private void nextIsThrowOnFailure() { + final AbstractInsnNode c = cursor; + nextIsInvokeStatic("kotlin/ResultKt", "throwOnFailure"); + if (cursor == null) { + cursor = c; + // Before resolution of + // https://youtrack.jetbrains.com/issue/KT-28015 in + // Kotlin 1.3.30 + nextIs(Opcodes.DUP); + nextIsType(Opcodes.INSTANCEOF, "kotlin/Result$Failure"); + nextIs(Opcodes.IFEQ); + nextIsType(Opcodes.CHECKCAST, "kotlin/Result$Failure"); + nextIs(Opcodes.GETFIELD); + nextIs(Opcodes.ATHROW); + nextIs(Opcodes.POP); + } + } + private void nextIsCreateStateInstance() { nextIs(Opcodes.INSTANCEOF); |