/* * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the license/LICENSE.txt file. */ package kotlin.coroutines.experimental.intrinsics import kotlin.coroutines.experimental.* @SinceKotlin("1.1") @kotlin.internal.InlineOnly @Suppress("UNUSED_PARAMETER") public suspend inline fun suspendCoroutineOrReturn(crossinline block: (Continuation) -> Any?): T = suspendCoroutineUninterceptedOrReturn { cont -> block(cont.intercepted()) } /** * Obtains the current continuation instance inside suspend functions and either suspends * currently running coroutine or returns result immediately without suspension. * * Unlike [suspendCoroutineOrReturn] it does not intercept continuation. */ @SinceKotlin("1.2") public suspend fun suspendCoroutineUninterceptedOrReturn(block: (Continuation) -> Any?): T = returnIfSuspended(block(getContinuation())) /** * Intercept continuation with [ContinuationInterceptor]. */ @SinceKotlin("1.2") @kotlin.internal.InlineOnly public inline fun Continuation.intercepted() = normalizeContinuation(this) /** * This value is used as a return value of [suspendCoroutineOrReturn] `block` argument to state that * the execution was suspended and will not return any result immediately. */ @SinceKotlin("1.1") public val COROUTINE_SUSPENDED: Any = Any() @SinceKotlin("1.1") @Suppress("UNCHECKED_CAST") @kotlin.internal.InlineOnly public inline fun (suspend () -> T).startCoroutineUninterceptedOrReturn( completion: Continuation ): Any? { val self_0 = this val cmpt_0 = completion return js("self_0.invoke(cmpt_0)") // TODO: use clean version once function references is fixed // return (this as Function1, Any?>).invoke(completion) } @SinceKotlin("1.1") @Suppress("UNCHECKED_CAST") @kotlin.internal.InlineOnly public inline fun (suspend R.() -> T).startCoroutineUninterceptedOrReturn( receiver: R, completion: Continuation ): Any? { val self_0 = this val rec_0 = receiver val cmpt_0 = completion return js("self_0.invoke(rec_0, cmpt_0)") // TODO: use clean version once function references is fixed // return (this as Function2, Any?>).invoke(receiver, completion) } @SinceKotlin("1.1") public fun (suspend R.() -> T).createCoroutineUnchecked( receiver: R, completion: Continuation ): Continuation { return if (this !is CoroutineImpl) { buildContinuationByInvokeCall(completion) { @Suppress("UNCHECKED_CAST") (this as Function2, Any?>).invoke(receiver, completion) } } else { (create(receiver, completion) as CoroutineImpl).facade } } @SinceKotlin("1.1") public fun (suspend () -> T).createCoroutineUnchecked( completion: Continuation ): Continuation { return if (this !is CoroutineImpl) { buildContinuationByInvokeCall(completion) { @Suppress("UNCHECKED_CAST") (this as Function1, Any?>).invoke(completion) } } else { (create(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 interceptContinuationIfNeeded(completion.context, continuation) }