Skip to content

Instantly share code, notes, and snippets.

@aleksandarzekovic
Created September 5, 2022 18:15
Show Gist options
  • Save aleksandarzekovic/408c6326fea0e734cb5d39f00645ba85 to your computer and use it in GitHub Desktop.
Save aleksandarzekovic/408c6326fea0e734cb5d39f00645ba85 to your computer and use it in GitHub Desktop.
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