diff --git a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java index 2e52ba1..0e29334 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java @@ -245,30 +245,33 @@ public class ClassesProcessor implements CodeConstants { mt.expandData(); InstructionSequence seq = mt.getInstructionSequence(); - int len = seq.length(); - for (int i = 0; i < len; i++) { - Instruction instr = seq.getInstr(i); - - switch(instr.opcode) { - case opc_checkcast: - case opc_instanceof: - if(cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) { - ref_counter++; - ref_not_new = true; - } - break; - case opc_new: - case opc_anewarray: - case opc_multianewarray: - if(cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) { - ref_counter++; - } - break; - case opc_getstatic: - case opc_putstatic: - if(cl.qualifiedName.equals(pool.getLinkConstant(instr.operand(0)).classname)) { - ref_counter++; - ref_not_new = true; + if(seq != null) { + + int len = seq.length(); + for (int i = 0; i < len; i++) { + Instruction instr = seq.getInstr(i); + + switch(instr.opcode) { + case opc_checkcast: + case opc_instanceof: + if(cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) { + ref_counter++; + ref_not_new = true; + } + break; + case opc_new: + case opc_anewarray: + case opc_multianewarray: + if(cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) { + ref_counter++; + } + break; + case opc_getstatic: + case opc_putstatic: + if(cl.qualifiedName.equals(pool.getLinkConstant(instr.operand(0)).classname)) { + ref_counter++; + ref_not_new = true; + } } } } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 896d2db..b2df702 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -123,6 +123,7 @@ public class SingleClassesTest { @Test public void testGroovyClass() { doTest("pkg/TestGroovyClass"); } @Test public void testGroovyTrait() { doTest("pkg/TestGroovyTrait"); } @Test public void testPrivateClasses() { doTest("pkg/PrivateClasses"); } + @Test public void testSuspendLambdaKt() { doTest("pkg/TestSuspendLambdaKt"); } private void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/testData/classes/pkg/TestSuspendLambdaKt$sl1$1.class b/testData/classes/pkg/TestSuspendLambdaKt$sl1$1.class new file mode 100644 index 0000000..dd1fe0e Binary files /dev/null and b/testData/classes/pkg/TestSuspendLambdaKt$sl1$1.class differ diff --git a/testData/classes/pkg/TestSuspendLambdaKt.class b/testData/classes/pkg/TestSuspendLambdaKt.class new file mode 100644 index 0000000..c686101 Binary files /dev/null and b/testData/classes/pkg/TestSuspendLambdaKt.class differ diff --git a/testData/results/TestSuspendLambdaKt.dec b/testData/results/TestSuspendLambdaKt.dec new file mode 100644 index 0000000..2193908 --- /dev/null +++ b/testData/results/TestSuspendLambdaKt.dec @@ -0,0 +1,139 @@ +import kotlin.Metadata; +import kotlin.Unit; +import kotlin.SuccessOrFailure.Failure; +import kotlin.coroutines.Continuation; +import kotlin.coroutines.intrinsics.IntrinsicsKt; +import kotlin.coroutines.jvm.internal.SuspendLambda; +import kotlin.jvm.functions.Function1; +import kotlin.jvm.internal.Intrinsics; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@Metadata( + mv = {1, 1, 11}, + bv = {1, 0, 2}, + k = 2, + xi = 2, + d1 = {"\u0000\u0016\n\u0000\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0010\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\",\u0010\u0000\u001a\u0018\b\u0001\u0012\n\u0012\b\u0012\u0004\u0012\u00020\u00030\u0002\u0012\u0006\u0012\u0004\u0018\u00010\u00040\u0001ø\u0001\u0000¢\u0006\n\n\u0002\u0010\u0007\u001a\u0004\b\u0005\u0010\u0006\u0082\u0002\u0004\n\u0002\b\u0019"}, + d2 = {"sl1", "Lkotlin/Function1;", "Lkotlin/coroutines/Continuation;", "", "", "getSl1", "()Lkotlin/jvm/functions/Function1;", "Lkotlin/jvm/functions/Function1;"} +) +public final class TestSuspendLambdaKt { + @NotNull + private static final Function1, Object> sl1; + + @NotNull + public static final Function1, Object> getSl1() { + return sl1; + } + + static { + @Metadata( + mv = {1, 1, 11}, + bv = {1, 0, 2}, + k = 3, + xi = 2, + d1 = {"\u0000\n\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0002\u0010\u0000\u001a\u00020\u0001H\u008a@ø\u0001\u0000¢\u0006\u0004\b\u0002\u0010\u0003"}, + d2 = {"", "", "invoke", "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;"} + ) + final class NamelessClass_1 extends SuspendLambda implements Function1, Object> { + int label; + + @Nullable + public final Object invokeSuspend(@NotNull Object var1) { + Object var3 = IntrinsicsKt.getCOROUTINE_SUSPENDED(); + switch(this.label) { + case 0: + if (var1 instanceof Failure) { + throw ((Failure)var1).exception; + } + + String var2 = "SL1";// 3 + System.out.println(var2); + return Unit.INSTANCE;// 4 + default: + throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine"); + } + } + + NamelessClass_1(Continuation var1) { + super(1, var1); + } + + @NotNull + public final Continuation create(@NotNull Continuation continuation) { + Intrinsics.checkParameterIsNotNull(continuation, "continuation"); + NamelessClass_1 var2 = new NamelessClass_1(continuation); + return var2; + } + + @Nullable + public final Object invoke(@NotNull Continuation continuation) { + return ((NamelessClass_1)this.create(continuation)).invokeSuspend(Unit.INSTANCE); + } + } + + sl1 = (Function1)(new NamelessClass_1((Continuation)null));// 2 + } +} + +class 'TestSuspendLambdaKt' { + method 'getSl1 ()Lkotlin/jvm/functions/Function1;' { + 0 25 + 3 25 + } + + method ' ()V' { + 4 74 + 8 74 + b 74 + e 75 + } +} + +class 'TestSuspendLambdaKt$sl1$1' { + method 'invokeSuspend (Ljava/lang/Object;)Ljava/lang/Object;' { + 0 42 + 3 42 + 5 43 + 8 43 + 1e 45 + 21 45 + 24 46 + 27 46 + 2a 46 + 2c 49 + 2e 49 + 2f 50 + 33 50 + 36 51 + 39 51 + 3e 53 + 43 53 + } + + method ' (Lkotlin/coroutines/Continuation;)V' { + 1 58 + 3 58 + 6 59 + } + + method 'create (Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;' { + 1 63 + 3 63 + e 64 + 10 65 + } + + method 'invoke (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;' { + 2 70 + 5 70 + 8 70 + b 70 + e 70 + } +} + +Lines mapping: +2 <-> 75 +3 <-> 50 +4 <-> 52 diff --git a/testData/src/pkg/TestSuspendLambda.kt b/testData/src/pkg/TestSuspendLambda.kt new file mode 100644 index 0000000..6feef9d --- /dev/null +++ b/testData/src/pkg/TestSuspendLambda.kt @@ -0,0 +1,4 @@ + +val sl1: suspend () -> Unit = { + println("SL1") +} \ No newline at end of file