package basic
import kotlin.concurrent.thread
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
internal suspend fun bar() {
suspendCoroutine {
thread {
Thread.sleep(1000)
it.resume(Unit)
}
}
}
package basic
class SimpleCoroutine {
private suspend fun foo() {
bar()
}
}
Bytecode for above个
// ================basic/SimpleCoroutine.class =================
// class version 52.0 (52)
// access flags 0x31
public final class basic/SimpleCoroutine {
// access flags 0x12
// signature (Lkotlin/coroutines/Continuation<-Lkotlin/Unit;>;)Ljava/lang/Object;
// declaration: foo(kotlin.coroutines.Continuation<? super kotlin.Unit>)
private final foo(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
L0
LINENUMBER 5 L0
ALOAD 1
INVOKESTATIC basic/BarKt.bar (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
DUP
INVOKESTATIC kotlin/coroutines/intrinsics/IntrinsicsKt.getCOROUTINE_SUSPENDED ()Ljava/lang/Object;
IF_ACMPNE L1
ARETURN
L1
POP
L2
LINENUMBER 6 L2
GETSTATIC kotlin/Unit.INSTANCE : Lkotlin/Unit;
ARETURN
L3
LOCALVARIABLE this Lbasic/SimpleCoroutine; L0 L3 0
LOCALVARIABLE $completion Lkotlin/coroutines/Continuation; L0 L3 1
MAXSTACK = 3
MAXLOCALS = 2
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lbasic/SimpleCoroutine; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
@Lkotlin/Metadata;(mv={1, 7, 0}, k=1, d1={"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\u0008\u0002\n\u0002\u0010\u0002\n\u0002\u0008\u0002\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0011\u0010\u0003\u001a\u00020\u0004H\u0082@\u00f8\u0001\u0000\u00a2\u0006\u0002\u0010\u0005\u0082\u0002\u0004\n\u0002\u0008\u0019\u00a8\u0006\u0006"}, d2={"Lbasic/SimpleCoroutine;", "", "()V", "foo", "", "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "KotlinSuspendingFunctions"})
// compiled from: SimpleCoroutine.kt
}
// ================META-INF/KotlinSuspendingFunctions.kotlin_module =================
"*
Decompiled Java code个
package basic;
import kotlin.Metadata;
import kotlin.Unit;
import kotlin.coroutines.Continuation;
import kotlin.coroutines.intrinsics.IntrinsicsKt;
public final class SimpleCoroutine {
private final Object foo(Continuation $completion) {
Object var10000 = BarKt.bar($completion);
return var10000 == IntrinsicsKt.getCOROUTINE_SUSPENDED() ? var10000 : Unit.INSTANCE;
}
}
我不确定是否应该说这是不必要的,因为我不确定这样做背后是否有正当的理由
Label 1个
Object var10000 = BarKt.bar($completion);
return var10000 == IntrinsicsKt.getCOROUTINE_SUSPENDED() ? var10000 : Unit.INSTANCE;
原来的方法是调用一个暂停方法/函数,对应的字节代码应该如下所示
BarKt.bar($completion);
WHY?个
if you see Label 1个, it is doing a check and returning value, but that check seems to be meaning less, since it returns the same value that it received from the call, If no manipulation or conditional return is required then why to have this overhead?
102