Created
September 5, 2022 18:15
-
-
Save aleksandarzekovic/408c6326fea0e734cb5d39f00645ba85 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public final override fun resumeWith(result: Result<Any?>) { | |
// This loop unrolls recursion in current.resumeWith(param) to make saner and shorter stack traces on resume | |
var current = this | |
var param = result | |
while (true) { | |
// Invoke "resume" debug probe on every resumed continuation, so that a debugging library infrastructure | |
// can precisely track what part of suspended callstack was already resumed | |
probeCoroutineResumed(current) | |
with(current) { | |
val completion = completion!! // fail fast when trying to resume continuation without completion | |
val outcome: Result<Any?> = | |
try { | |
val outcome = invokeSuspend(param) | |
if (outcome === COROUTINE_SUSPENDED) return | |
Result.success(outcome) | |
} catch (exception: Throwable) { | |
Result.failure(exception) | |
} | |
releaseIntercepted() // this state machine instance is terminating | |
if (completion is BaseContinuationImpl) { | |
// unrolling recursion via loop | |
current = completion | |
param = outcome | |
} else { | |
// top-level completion reached -- invoke and return | |
completion.resumeWith(outcome) | |
return | |
} | |
} | |
} | |
} | |
protected abstract fun invokeSuspend(result: Result<Any?>): Any? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment