diff --git a/js/js.libraries/src/core/coroutines.kt b/js/js.libraries/src/core/coroutines.kt index 42e129f6cd3..8973f86a03f 100644 --- a/js/js.libraries/src/core/coroutines.kt +++ b/js/js.libraries/src/core/coroutines.kt @@ -17,15 +17,6 @@ package kotlin.coroutines.experimental import kotlin.coroutines.experimental.intrinsics.* -internal fun (suspend R.() -> T).createCoroutineInternal( - receiver: R, - completion: Continuation -): Continuation = this.asDynamic()(receiver, completion, true) - -internal fun (suspend () -> T).createCoroutineInternal( - completion: Continuation -): Continuation = this.asDynamic()(completion, true) - @JsName("CoroutineImpl") internal abstract class CoroutineImpl(private val resultContinuation: Continuation) : Continuation { protected var state = 0 diff --git a/js/js.libraries/src/core/coroutinesIntrinsics.kt b/js/js.libraries/src/core/coroutinesIntrinsics.kt index 9d35af014e0..8fa75b06965 100644 --- a/js/js.libraries/src/core/coroutinesIntrinsics.kt +++ b/js/js.libraries/src/core/coroutinesIntrinsics.kt @@ -32,3 +32,14 @@ public inline fun (suspend R.() -> T).startCoroutineUninterceptedOrReturn receiver: R, completion: Continuation ): Any? = this.asDynamic()(receiver, completion, false) + +@SinceKotlin("1.1") +public fun (suspend R.() -> T).createCoroutineUnchecked( + receiver: R, + completion: Continuation +): Continuation = this.asDynamic()(receiver, completion, true) + +@SinceKotlin("1.1") +public fun (suspend () -> T).createCoroutineUnchecked( + completion: Continuation +): Continuation = this.asDynamic()(completion, true) diff --git a/libraries/stdlib/common/src/kotlin/CoroutinesH.kt b/libraries/stdlib/common/src/kotlin/CoroutinesH.kt index 1d5f9c77919..c88a7fe7e1b 100644 --- a/libraries/stdlib/common/src/kotlin/CoroutinesH.kt +++ b/libraries/stdlib/common/src/kotlin/CoroutinesH.kt @@ -14,14 +14,3 @@ internal header class SafeContinuation : Continuation { override fun resume(value: T): Unit override fun resumeWithException(exception: Throwable): Unit } - -@SinceKotlin("1.1") -internal header fun (suspend () -> T).createCoroutineInternal( - completion: Continuation -): Continuation - -@SinceKotlin("1.1") -internal header fun (suspend R.() -> T).createCoroutineInternal( - receiver: R, - completion: Continuation -): Continuation diff --git a/libraries/stdlib/common/src/kotlin/CoroutinesIntrinsicsH.kt b/libraries/stdlib/common/src/kotlin/CoroutinesIntrinsicsH.kt new file mode 100644 index 00000000000..4a4b24240ca --- /dev/null +++ b/libraries/stdlib/common/src/kotlin/CoroutinesIntrinsicsH.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package kotlin.coroutines.experimental.intrinsics + +import kotlin.coroutines.experimental.Continuation + +@SinceKotlin("1.1") +public header fun (suspend () -> T).createCoroutineUnchecked( + completion: Continuation +): Continuation + +@SinceKotlin("1.1") +public header fun (suspend R.() -> T).createCoroutineUnchecked( + receiver: R, + completion: Continuation +): Continuation diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibrary.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibrary.kt index 4e9df99d9a5..733a0ad4130 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibrary.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibrary.kt @@ -19,6 +19,7 @@ package kotlin.coroutines.experimental import kotlin.coroutines.experimental.intrinsics.COROUTINE_SUSPENDED import kotlin.coroutines.experimental.intrinsics.suspendCoroutineOrReturn +import kotlin.coroutines.experimental.intrinsics.createCoroutineUnchecked /** * Starts coroutine with receiver type [R] and result type [T]. @@ -31,7 +32,7 @@ public fun (suspend R.() -> T).startCoroutine( receiver: R, completion: Continuation ) { - createCoroutineInternal(receiver, completion).resume(Unit) + createCoroutineUnchecked(receiver, completion).resume(Unit) } /** @@ -44,7 +45,7 @@ public fun (suspend R.() -> T).startCoroutine( public fun (suspend () -> T).startCoroutine( completion: Continuation ) { - createCoroutineInternal(completion).resume(Unit) + createCoroutineUnchecked(completion).resume(Unit) } /** @@ -58,7 +59,7 @@ public fun (suspend () -> T).startCoroutine( public fun (suspend R.() -> T).createCoroutine( receiver: R, completion: Continuation -): Continuation = SafeContinuation(createCoroutineInternal(receiver, completion), COROUTINE_SUSPENDED) +): Continuation = SafeContinuation(createCoroutineUnchecked(receiver, completion), COROUTINE_SUSPENDED) /** * Creates coroutine without receiver and with result type [T]. @@ -70,7 +71,7 @@ public fun (suspend R.() -> T).createCoroutine( @Suppress("UNCHECKED_CAST") public fun (suspend () -> T).createCoroutine( completion: Continuation -): Continuation = SafeContinuation(createCoroutineInternal(completion), COROUTINE_SUSPENDED) +): Continuation = SafeContinuation(createCoroutineUnchecked(completion), COROUTINE_SUSPENDED) /** * Obtains the current continuation instance inside suspend functions and suspends diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibraryJvm.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibraryJvm.kt deleted file mode 100644 index 9856022c112..00000000000 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/CoroutinesLibraryJvm.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:kotlin.jvm.JvmName("CoroutinesJvmKt") -@file:kotlin.jvm.JvmVersion -package kotlin.coroutines.experimental - -import kotlin.coroutines.experimental.jvm.internal.CoroutineImpl -import kotlin.coroutines.experimental.jvm.internal.interceptContinuationIfNeeded - -@SinceKotlin("1.1") -internal fun (suspend () -> T).createCoroutineInternal( - completion: Continuation -): Continuation = - if (this !is CoroutineImpl) - buildContinuationByInvokeCall(completion) { - (this as Function1, Any?>).invoke(completion) - } - else - (this.create(completion) as CoroutineImpl).facade - -@SinceKotlin("1.1") -internal fun (suspend R.() -> T).createCoroutineInternal( - receiver: R, - completion: Continuation -): Continuation = - if (this !is CoroutineImpl) - buildContinuationByInvokeCall(completion) { - (this as Function2, Any?>).invoke(receiver, completion) - } - else - ((this as CoroutineImpl).create(receiver, completion) as CoroutineImpl).facade - - -private inline fun buildContinuationByInvokeCall( - completion: Continuation, - crossinline block: () -> Any? -): Continuation { - val continuation = - object : Continuation { - override val context: CoroutineContext - get() = completion.context - - override fun resume(value: Unit) { - processBareContinuationResume(completion, block) - } - - override fun resumeWithException(exception: Throwable) { - completion.resumeWithException(exception) - } - } - - return completion.context.interceptContinuationIfNeeded(continuation) -} - diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/SequenceBuilder.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/SequenceBuilder.kt index 12b92078973..8df9d4dcb03 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/SequenceBuilder.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/SequenceBuilder.kt @@ -32,7 +32,7 @@ public fun buildSequence(builderAction: suspend SequenceBuilder.() -> Uni @SinceKotlin("1.1") public fun buildIterator(builderAction: suspend SequenceBuilder.() -> Unit): Iterator { val iterator = SequenceBuilderIterator() - iterator.nextStep = builderAction.createCoroutine(receiver = iterator, completion = iterator) + iterator.nextStep = builderAction.createCoroutineUnchecked(receiver = iterator, completion = iterator) return iterator } diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/Intrinsics.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/Intrinsics.kt index d500c4883cc..aa2d221bad9 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/Intrinsics.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/Intrinsics.kt @@ -19,6 +19,8 @@ package kotlin.coroutines.experimental.intrinsics import kotlin.coroutines.experimental.Continuation +import kotlin.coroutines.experimental.CoroutineContext +import kotlin.coroutines.experimental.processBareContinuationResume /** * Obtains the current continuation instance inside suspend functions and either suspend @@ -48,3 +50,53 @@ public inline suspend fun suspendCoroutineOrReturn(crossinline block: (Conti @SinceKotlin("1.1") public val COROUTINE_SUSPENDED: Any = Any() +// JVM declarations + +@SinceKotlin("1.1") +@kotlin.jvm.JvmVersion +public fun (suspend () -> T).createCoroutineUnchecked( + completion: Continuation +): Continuation = + if (this !is kotlin.coroutines.experimental.jvm.internal.CoroutineImpl) + buildContinuationByInvokeCall(completion) { + (this as Function1, Any?>).invoke(completion) + } + else + (this.create(completion) as kotlin.coroutines.experimental.jvm.internal.CoroutineImpl).facade + +@SinceKotlin("1.1") +@kotlin.jvm.JvmVersion +public fun (suspend R.() -> T).createCoroutineUnchecked( + receiver: R, + completion: Continuation +): Continuation = + if (this !is kotlin.coroutines.experimental.jvm.internal.CoroutineImpl) + buildContinuationByInvokeCall(completion) { + (this as Function2, Any?>).invoke(receiver, completion) + } + else + (this.create(receiver, completion) as kotlin.coroutines.experimental.jvm.internal.CoroutineImpl).facade + +// INTERNAL DEFINITIONS + +@kotlin.jvm.JvmVersion +private inline fun buildContinuationByInvokeCall( + completion: Continuation, + crossinline block: () -> Any? +): Continuation { + val continuation = + object : Continuation { + override val context: CoroutineContext + get() = completion.context + + override fun resume(value: Unit) { + processBareContinuationResume(completion, block) + } + + override fun resumeWithException(exception: Throwable) { + completion.resumeWithException(exception) + } + } + + return kotlin.coroutines.experimental.jvm.internal.interceptContinuationIfNeeded(completion.context, continuation) +} diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/IntrinsicsJvm.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/IntrinsicsJvm.kt index 6ddfee334ed..f51c8ce0ebe 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/IntrinsicsJvm.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/intrinsics/IntrinsicsJvm.kt @@ -14,7 +14,6 @@ * limitations under the License. */ -@file:kotlin.jvm.JvmName("IntrinsicsJvmKt") @file:kotlin.jvm.JvmVersion package kotlin.coroutines.experimental.intrinsics import kotlin.coroutines.experimental.* diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineImpl.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineImpl.kt index 1d9207177bf..2898b2585da 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineImpl.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineImpl.kt @@ -41,7 +41,7 @@ abstract class CoroutineImpl( private var _facade: Continuation? = null val facade: Continuation get() { - if (_facade == null) _facade = _context!!.interceptContinuationIfNeeded(this) + if (_facade == null) _facade = interceptContinuationIfNeeded(_context!!, this) return _facade!! } diff --git a/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineIntrinsics.kt b/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineIntrinsics.kt index 74c4b8de03c..48bff355ef0 100644 --- a/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineIntrinsics.kt +++ b/libraries/stdlib/src/kotlin/coroutines/experimental/jvm/internal/CoroutineIntrinsics.kt @@ -26,6 +26,7 @@ import kotlin.coroutines.experimental.jvm.internal.CoroutineImpl fun normalizeContinuation(continuation: Continuation): Continuation = (continuation as? CoroutineImpl)?.facade ?: continuation -internal fun CoroutineContext.interceptContinuationIfNeeded( +internal fun interceptContinuationIfNeeded( + context: CoroutineContext, continuation: Continuation -) = this[ContinuationInterceptor]?.interceptContinuation(continuation) ?: continuation +) = context[ContinuationInterceptor]?.interceptContinuation(continuation) ?: continuation diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 7405726242e..f83c23758ba 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -2049,6 +2049,8 @@ public final class kotlin/coroutines/experimental/SequenceBuilderKt { } public final class kotlin/coroutines/experimental/intrinsics/IntrinsicsKt { + public static final fun createCoroutineUnchecked (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;)Lkotlin/coroutines/experimental/Continuation; + public static final fun createCoroutineUnchecked (Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/experimental/Continuation;)Lkotlin/coroutines/experimental/Continuation; public static synthetic fun COROUTINE_SUSPENDED$annotations ()V public static final fun getCOROUTINE_SUSPENDED ()Ljava/lang/Object; } diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt index 450059e581e..4aebc40b223 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt @@ -1852,6 +1852,8 @@ public final class kotlin/coroutines/experimental/SequenceBuilderKt { } public final class kotlin/coroutines/experimental/intrinsics/IntrinsicsKt { + public static final fun createCoroutineUnchecked (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;)Lkotlin/coroutines/experimental/Continuation; + public static final fun createCoroutineUnchecked (Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/experimental/Continuation;)Lkotlin/coroutines/experimental/Continuation; public static synthetic fun COROUTINE_SUSPENDED$annotations ()V public static final fun getCOROUTINE_SUSPENDED ()Ljava/lang/Object; }