blob: ddda774cf4ea271d7e23ab3316bb532c933f366d [file] [log] [blame]
// 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();
}
}
}