diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt index 8945c38ac4f..b9e45b32b50 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt @@ -177,11 +177,10 @@ class CoroutineFunctionTransformer(private val program: JsProgram, private val f val instanceName = functionWithBody.scope.declareFreshName("instance") functionWithBody.body.statements += JsAstUtils.newVar(instanceName, JsNameRef(context.metadata.facadeName, instantiation)) - val invokeResume = JsInvocation(JsNameRef(context.metadata.resumeName, instanceName.makeRef()), JsLiteral.NULL).makeStmt() - val returnResult = JsReturn(JsNameRef(context.metadata.resultName, instanceName.makeRef())) + val invokeResume = JsReturn(JsInvocation(JsNameRef(context.metadata.doResumeName, instanceName.makeRef()), JsLiteral.NULL)) functionWithBody.body.statements += JsIf( - suspendedName.makeRef(), JsReturn(instanceName.makeRef()), JsBlock(invokeResume, returnResult)) + suspendedName.makeRef(), JsReturn(instanceName.makeRef()), invokeResume) } private fun generateCoroutineBody( diff --git a/js/js.libraries/src/core/coroutines.kt b/js/js.libraries/src/core/coroutines.kt index 5152ee82ff0..10f358118ca 100644 --- a/js/js.libraries/src/core/coroutines.kt +++ b/js/js.libraries/src/core/coroutines.kt @@ -28,7 +28,7 @@ import kotlin.coroutines.intrinsics.* public fun (suspend R.() -> T).createCoroutine( receiver: R, completion: Continuation -): Continuation = this.asDynamic()(receiver, completion, true).facade +): Continuation = this.asDynamic()(receiver, completion, true) /** * Starts coroutine with receiver type [R] and result type [T]. @@ -40,7 +40,8 @@ public fun (suspend R.() -> T).startCoroutine( receiver: R, completion: Continuation ) { - this.asDynamic()(receiver, completion) + val coroutine: Continuation = this.asDynamic()(receiver, completion, true) + coroutine.resume(null) } /** @@ -52,7 +53,7 @@ public fun (suspend R.() -> T).startCoroutine( @SinceKotlin("1.1") public fun (suspend () -> T).createCoroutine( completion: Continuation -): Continuation = this.asDynamic()(completion, true).facade +): Continuation = this.asDynamic()(completion, true) /** * Starts coroutine without receiver and with result type [T]. @@ -63,7 +64,8 @@ public fun (suspend () -> T).createCoroutine( public fun (suspend () -> T).startCoroutine( completion: Continuation ) { - this.asDynamic()(completion) + val coroutine: Continuation = this.asDynamic()(completion, true) + coroutine.resume(null) } /** @@ -97,22 +99,16 @@ internal abstract class CoroutineImpl(private val resultContinuation: Continuati override fun resume(data: Any?) { result = data - try { - result = doResume() - if (result != SUSPENDED_MARKER) { - val data = result - result = SUSPENDED_MARKER - resultContinuation.resume(data) - } - } - catch (e: Throwable) { - resultContinuation.resumeWithException(e) - } + doResumeWrapper() } override fun resumeWithException(exception: Throwable) { state = exceptionState this.exception = exception + doResumeWrapper() + } + + protected fun doResumeWrapper() { try { result = doResume() if (result != SUSPENDED_MARKER) {