JVM_IR: Treat suspend main wrapper as always tail-call function

In other words, never generate suspend call markers inside it.
This commit is contained in:
Ilmir Usmanov
2020-02-20 18:49:06 +01:00
parent 8c4eef9844
commit 325ad14ac9
4 changed files with 21 additions and 1 deletions
@@ -113,6 +113,10 @@ internal fun IrFunction.isInvokeSuspendOfContinuation(): Boolean =
internal fun IrFunction.isInvokeOfSuspendCallableReference(): Boolean = isSuspend && name.asString() == "invoke" &&
parentAsClass.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL
// Wrapper of suspend main is always tail-call and it is not generated as suspend function.
private fun IrFunction.isInvokeOfSuspendMainWrapper(): Boolean = !isSuspend && name.asString() == "invoke" &&
parentAsClass.origin == JvmLoweredDeclarationOrigin.LAMBDA_IMPL
internal fun IrFunction.isKnownToBeTailCall(): Boolean =
when (origin) {
IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER,
@@ -125,7 +129,7 @@ internal fun IrFunction.isKnownToBeTailCall(): Boolean =
IrDeclarationOrigin.BRIDGE,
IrDeclarationOrigin.BRIDGE_SPECIAL,
IrDeclarationOrigin.DELEGATED_MEMBER -> true
else -> isInvokeOfSuspendCallableReference()
else -> isInvokeOfSuspendMainWrapper() || isInvokeOfSuspendCallableReference()
}
internal fun IrFunction.shouldNotContainSuspendMarkers(): Boolean =