Throw InvalidDebugInfoException for input with stack maps
This CL also adds a dump from the kotlin compiler that has such
invalid info.
Bug: 183185423
Change-Id: I60b1b9139347d1d754aba6fc6ffbebffe0f82334
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index e6bc084..3fb79c6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -2211,6 +2211,14 @@
TypeElement.fromDexType(phiTypeForBlock, Nullability.maybeNull(), appView),
local,
readType);
+ } else if (readType == RegisterReadType.DEBUG) {
+ throw new InvalidDebugInfoException(
+ "Information in locals-table is invalid with respect to the stack map table. "
+ + "Local refers to non-present stack map type for register: "
+ + register
+ + " with constraint "
+ + constraint
+ + ".");
} else {
assert method.getDefinition().getClassFileVersion().isLessThan(CfVersion.V1_8);
hasIncorrectStackMapTypes = true;
diff --git a/src/test/java/com/android/tools/r8/ir/DebugLocalStackMapTest.java b/src/test/java/com/android/tools/r8/ir/DebugLocalStackMapTest.java
new file mode 100644
index 0000000..ddda774
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/DebugLocalStackMapTest.java
@@ -0,0 +1,697 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class DebugLocalStackMapTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+ }
+
+ public DebugLocalStackMapTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testInvalidDebugLocals() throws Exception {
+ testForD8(parameters.getBackend())
+ .addProgramClassFileData(TestKtDump.dump())
+ .setMinApi(parameters.getApiLevel())
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ diagnostics.assertInfosMatch(
+ ImmutableList.of(
+ diagnosticMessage(
+ containsString("Stripped invalid locals information from 1 method")),
+ diagnosticMessage(
+ allOf(
+ containsString(
+ "java.lang.Object"
+ + " TestKt.suspendHere(kotlin.coroutines.Continuation)"),
+ containsString(
+ "Information in locals-table is invalid with respect to the"
+ + " stack map table"))),
+ diagnosticMessage(
+ containsString(
+ "Some warnings are typically a sign of using an outdated Java"
+ + " toolchain"))));
+ });
+ }
+
+ public static class TestKtDump implements Opcodes {
+
+ public static byte[] dump() {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V1_8, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, "TestKt", null, "java/lang/Object", null);
+
+ classWriter.visitSource(
+ "test.kt",
+ "SMAP\n"
+ + "test.kt\n"
+ + "Kotlin\n"
+ + "*S Kotlin\n"
+ + "*F\n"
+ + "+ 1 test.kt\n"
+ + "TestKt\n"
+ + "*L\n"
+ + "1#1,17:1\n"
+ + "4#1,4:18\n"
+ + "10#1:22\n"
+ + "4#1,4:23\n"
+ + "*S KotlinDebug\n"
+ + "*F\n"
+ + "+ 1 test.kt\n"
+ + "TestKt\n"
+ + "*L\n"
+ + "10#1:18,4\n"
+ + "12#1:22\n"
+ + "12#1:23,4\n"
+ + "*E\n");
+
+ {
+ annotationVisitor0 = classWriter.visitAnnotation("Lkotlin/Metadata;", true);
+ annotationVisitor0.visit("mv", new int[] {1, 5, 0});
+ annotationVisitor0.visit("k", new Integer(2));
+ annotationVisitor0.visit("xi", new Integer(50));
+ {
+ AnnotationVisitor annotationVisitor1 = annotationVisitor0.visitArray("d1");
+ annotationVisitor1.visit(
+ null,
+ "\u0000\u0012\n"
+ + "\u0000\n"
+ + "\u0002\u0010\u0002\n"
+ + "\u0002\u0008\u0002\n"
+ + "\u0002\u0010\u000e\n"
+ + "\u0002\u0008\u0004\u001a\u0011\u0010\u0000\u001a\u00020\u0001H\u0086@\u00f8\u0001\u0000\u00a2\u0006\u0002\u0010\u0002\u001a\u0011\u0010\u0003\u001a\u00020\u0004H\u0086@\u00f8\u0001\u0000\u00a2\u0006\u0002\u0010\u0002\u001a\u0011\u0010\u0005\u001a\u00020\u0004H\u0086H\u00f8\u0001\u0000\u00a2\u0006\u0002\u0010\u0002\u001a\u0019\u0010\u0006\u001a\u00020\u00042\u0006\u0010\u0007\u001a\u00020\u0004H\u0086H\u00f8\u0001\u0000\u00a2\u0006\u0002\u0010\u0008\u0082\u0002\u0004\n"
+ + "\u0002\u0008\u0019");
+ annotationVisitor1.visitEnd();
+ }
+ {
+ AnnotationVisitor annotationVisitor1 = annotationVisitor0.visitArray("d2");
+ annotationVisitor1.visit(null, "main");
+ annotationVisitor1.visit(null, "");
+ annotationVisitor1.visit(null, "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;");
+ annotationVisitor1.visit(null, "mainSuspend");
+ annotationVisitor1.visit(null, "");
+ annotationVisitor1.visit(null, "suspendHere");
+ annotationVisitor1.visit(null, "suspendThere");
+ annotationVisitor1.visit(null, "v");
+ annotationVisitor1.visit(
+ null, "(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;");
+ annotationVisitor1.visitEnd();
+ }
+ annotationVisitor0.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_FINAL | ACC_STATIC,
+ "suspendHere",
+ "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;",
+ "(Lkotlin/coroutines/Continuation<-Ljava/lang/String;>;)Ljava/lang/Object;",
+ null);
+ {
+ annotationVisitor0 =
+ methodVisitor.visitAnnotation("Lorg/jetbrains/annotations/Nullable;", false);
+ annotationVisitor0.visitEnd();
+ }
+ methodVisitor.visitAnnotableParameterCount(1, false);
+ {
+ annotationVisitor0 =
+ methodVisitor.visitParameterAnnotation(
+ 0, "Lorg/jetbrains/annotations/NotNull;", false);
+ annotationVisitor0.visitEnd();
+ }
+ methodVisitor.visitCode();
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitTypeInsn(INSTANCEOF, "TestKt$suspendHere$1");
+ Label label0 = new Label();
+ methodVisitor.visitJumpInsn(IFEQ, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitTypeInsn(CHECKCAST, "TestKt$suspendHere$1");
+ methodVisitor.visitVarInsn(ASTORE, 13);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "label", "I");
+ methodVisitor.visitLdcInsn(new Integer(-2147483648));
+ methodVisitor.visitInsn(IAND);
+ methodVisitor.visitJumpInsn(IFEQ, label0);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "label", "I");
+ methodVisitor.visitLdcInsn(new Integer(-2147483648));
+ methodVisitor.visitInsn(ISUB);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "label", "I");
+ Label label1 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label1);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "TestKt$suspendHere$1");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "TestKt$suspendHere$1",
+ "<init>",
+ "(Lkotlin/coroutines/Continuation;)V",
+ false);
+ methodVisitor.visitVarInsn(ASTORE, 13);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 14,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "TestKt$suspendHere$1"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(
+ GETFIELD, "TestKt$suspendHere$1", "result", "Ljava/lang/Object;");
+ methodVisitor.visitVarInsn(ASTORE, 12);
+ Label label2 = new Label();
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/intrinsics/IntrinsicsKt",
+ "getCOROUTINE_SUSPENDED",
+ "()Ljava/lang/Object;",
+ false);
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(10, label3);
+ methodVisitor.visitVarInsn(ASTORE, 14);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "label", "I");
+ Label label4 = new Label();
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTableSwitchInsn(0, 2, label7, new Label[] {label4, label5, label6});
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitVarInsn(ALOAD, 12);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 1);
+ Label label8 = new Label();
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(10, label8);
+ methodVisitor.visitLdcInsn("O");
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label9 = new Label();
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 3);
+ Label label10 = new Label();
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(18, label10);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "L$0", "Ljava/lang/Object;");
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitInsn(ICONST_1);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "label", "I");
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/coroutines/Continuation");
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ Label label11 = new Label();
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 5);
+ Label label12 = new Label();
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(19, label12);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 7);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitFieldInsn(
+ GETSTATIC, "kotlin/Result", "Companion", "Lkotlin/Result$Companion;");
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 9);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/Result",
+ "constructor-impl",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ false);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE,
+ "kotlin/coroutines/Continuation",
+ "resumeWith",
+ "(Ljava/lang/Object;)V",
+ true);
+ Label label13 = new Label();
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(20, label13);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/intrinsics/IntrinsicsKt",
+ "getCOROUTINE_SUSPENDED",
+ "()Ljava/lang/Object;",
+ false);
+ Label label14 = new Label();
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(18, label14);
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/intrinsics/IntrinsicsKt",
+ "getCOROUTINE_SUSPENDED",
+ "()Ljava/lang/Object;",
+ false);
+ Label label15 = new Label();
+ methodVisitor.visitJumpInsn(IF_ACMPNE, label15);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/coroutines/Continuation");
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/jvm/internal/DebugProbesKt",
+ "probeCoroutineSuspended",
+ "(Lkotlin/coroutines/Continuation;)V",
+ false);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "java/lang/String",
+ Opcodes.INTEGER,
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "kotlin/Result$Companion",
+ Opcodes.INTEGER,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 1,
+ new Object[] {"java/lang/Object"});
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 14);
+ Label label16 = new Label();
+ methodVisitor.visitJumpInsn(IF_ACMPNE, label16);
+ Label label17 = new Label();
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitLineNumber(10, label17);
+ methodVisitor.visitVarInsn(ALOAD, 14);
+ methodVisitor.visitInsn(ARETURN);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 1);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "L$0", "Ljava/lang/Object;");
+ methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 12);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 12);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(21, label16);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "java/lang/String",
+ Opcodes.INTEGER,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 1,
+ new Object[] {"java/lang/Object"});
+ methodVisitor.visitInsn(NOP);
+ Label label18 = new Label();
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
+ Label label19 = new Label();
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(10, label19);
+ methodVisitor.visitLdcInsn("K");
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ASTORE, 10);
+ Label label20 = new Label();
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 3);
+ Label label21 = new Label();
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(18, label21);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "L$0", "Ljava/lang/Object;");
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitVarInsn(ALOAD, 10);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "L$1", "Ljava/lang/Object;");
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitInsn(ICONST_2);
+ methodVisitor.visitFieldInsn(PUTFIELD, "TestKt$suspendHere$1", "label", "I");
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/coroutines/Continuation");
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ Label label22 = new Label();
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 5);
+ Label label23 = new Label();
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitLineNumber(19, label23);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 7);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitFieldInsn(
+ GETSTATIC, "kotlin/Result", "Companion", "Lkotlin/Result$Companion;");
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 9);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/Result",
+ "constructor-impl",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ false);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE,
+ "kotlin/coroutines/Continuation",
+ "resumeWith",
+ "(Ljava/lang/Object;)V",
+ true);
+ Label label24 = new Label();
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitLineNumber(20, label24);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/intrinsics/IntrinsicsKt",
+ "getCOROUTINE_SUSPENDED",
+ "()Ljava/lang/Object;",
+ false);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(18, label25);
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/intrinsics/IntrinsicsKt",
+ "getCOROUTINE_SUSPENDED",
+ "()Ljava/lang/Object;",
+ false);
+ Label label26 = new Label();
+ methodVisitor.visitJumpInsn(IF_ACMPNE, label26);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/coroutines/Continuation");
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/coroutines/jvm/internal/DebugProbesKt",
+ "probeCoroutineSuspended",
+ "(Lkotlin/coroutines/Continuation;)V",
+ false);
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "java/lang/String",
+ Opcodes.INTEGER,
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "kotlin/Result$Companion",
+ Opcodes.INTEGER,
+ "java/lang/String",
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 1,
+ new Object[] {"java/lang/Object"});
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 14);
+ Label label27 = new Label();
+ methodVisitor.visitJumpInsn(IF_ACMPNE, label27);
+ Label label28 = new Label();
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(10, label28);
+ methodVisitor.visitVarInsn(ALOAD, 14);
+ methodVisitor.visitInsn(ARETURN);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 1);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "L$1", "Ljava/lang/Object;");
+ methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
+ methodVisitor.visitVarInsn(ASTORE, 10);
+ methodVisitor.visitVarInsn(ALOAD, 13);
+ methodVisitor.visitFieldInsn(GETFIELD, "TestKt$suspendHere$1", "L$0", "Ljava/lang/Object;");
+ methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 12);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "kotlin/ResultKt", "throwOnFailure", "(Ljava/lang/Object;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 12);
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(21, label27);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.INTEGER,
+ "java/lang/String",
+ Opcodes.INTEGER,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/String",
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 1,
+ new Object[] {"java/lang/Object"});
+ methodVisitor.visitInsn(NOP);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitVarInsn(ASTORE, 11);
+ methodVisitor.visitVarInsn(ALOAD, 10);
+ methodVisitor.visitVarInsn(ALOAD, 11);
+ Label label30 = new Label();
+ methodVisitor.visitLabel(label30);
+ methodVisitor.visitLineNumber(10, label30);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "kotlin/jvm/internal/Intrinsics",
+ "stringPlus",
+ "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;",
+ false);
+ methodVisitor.visitInsn(ARETURN);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 15,
+ new Object[] {
+ "kotlin/coroutines/Continuation",
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ Opcodes.TOP,
+ "java/lang/Object",
+ "TestKt$suspendHere$1",
+ "java/lang/Object"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitTypeInsn(NEW, "java/lang/IllegalStateException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitLdcInsn("call to 'resume' before 'invoke' with coroutine");
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "java/lang/IllegalStateException",
+ "<init>",
+ "(Ljava/lang/String;)V",
+ false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLocalVariable("v$iv", "Ljava/lang/String;", null, label9, label15, 2);
+ methodVisitor.visitLocalVariable("v$iv", "Ljava/lang/String;", null, label20, label26, 2);
+ methodVisitor.visitLocalVariable(
+ "x$iv", "Lkotlin/coroutines/Continuation;", null, label11, label14, 4);
+ methodVisitor.visitLocalVariable(
+ "x$iv", "Lkotlin/coroutines/Continuation;", null, label22, label25, 4);
+ methodVisitor.visitLocalVariable(
+ "$i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$suspendThere$2$iv",
+ "I",
+ null,
+ label12,
+ label14,
+ 5);
+ methodVisitor.visitLocalVariable("$i$f$suspendThere", "I", null, label10, label18, 3);
+ methodVisitor.visitLocalVariable(
+ "$i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$suspendThere$2$iv",
+ "I",
+ null,
+ label23,
+ label25,
+ 5);
+ methodVisitor.visitLocalVariable("$i$f$suspendThere", "I", null, label21, label29, 3);
+ methodVisitor.visitLocalVariable("$i$f$suspendHere", "I", null, label8, label7, 1);
+ methodVisitor.visitLocalVariable(
+ "$continuation", "Lkotlin/coroutines/Continuation;", null, label1, label7, 13);
+ methodVisitor.visitLocalVariable("$result", "Ljava/lang/Object;", null, label2, label7, 12);
+ methodVisitor.visitMaxs(3, 15);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+ }
+}