Skip to content

Commit

Permalink
Fix class cast exception during undispatched resume of cancellable co…
Browse files Browse the repository at this point in the history
…ntinuation with onCancellation block (Kotlin#1967)

Fixes Kotlin#1966
  • Loading branch information
qwwdfsad authored Apr 29, 2020
1 parent d5766f3 commit be85455
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ internal fun <T> DispatchedTask<T>.resume(delegate: Continuation<T>, useMode: In
// slow-path - use delegate
val state = takeState()
val exception = getExceptionalResult(state)?.let { recoverStackTrace(it, delegate) }
val result = if (exception != null) Result.failure(exception) else Result.success(state as T)
val result = if (exception != null) Result.failure(exception) else Result.success(getSuccessfulResult<T>(state))
when (useMode) {
MODE_ATOMIC_DEFAULT -> delegate.resumeWith(result)
MODE_CANCELLABLE -> delegate.resumeCancellableWith(result)
Expand Down
12 changes: 12 additions & 0 deletions kotlinx-coroutines-core/common/test/CancellableResumeTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,16 @@ class CancellableResumeTest : TestBase() {
yield() // to coroutine -- throws cancellation exception
finish(9)
}


@Test
fun testResumeUnconfined() = runTest {
val outerScope = this
withContext(Dispatchers.Unconfined) {
val result = suspendCancellableCoroutine<String> {
outerScope.launch { it.resume("OK", {}) }
}
assertEquals("OK", result)
}
}
}

0 comments on commit be85455

Please sign in to comment.