JVM_IR: wrap inline suspend references in suspend lambdas

This commit is contained in:
pyos
2020-02-06 10:19:16 +01:00
committed by Ilmir Usmanov
parent c34d2f9daa
commit 08074bb60e
5 changed files with 6 additions and 6 deletions
@@ -119,6 +119,7 @@ internal fun IrFunction.isKnownToBeTailCall(): Boolean =
JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR,
JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE, JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE,
JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC, JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC,
JvmLoweredDeclarationOrigin.GENERATED_MEMBER_IN_CALLABLE_REFERENCE,
IrDeclarationOrigin.BRIDGE, IrDeclarationOrigin.BRIDGE,
IrDeclarationOrigin.BRIDGE_SPECIAL, IrDeclarationOrigin.BRIDGE_SPECIAL,
IrDeclarationOrigin.DELEGATED_MEMBER -> true IrDeclarationOrigin.DELEGATED_MEMBER -> true
@@ -653,6 +653,7 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
function.body == null || function.body == null ||
function.parentAsClass.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL || function.parentAsClass.origin == JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL ||
function.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || function.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER ||
function.origin == JvmLoweredDeclarationOrigin.GENERATED_MEMBER_IN_CALLABLE_REFERENCE ||
function.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE function.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE
private fun skip(function: IrFunction) = private fun skip(function: IrFunction) =
@@ -127,7 +127,7 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
name = Name.identifier("stub_for_inlining") name = Name.identifier("stub_for_inlining")
visibility = Visibilities.LOCAL visibility = Visibilities.LOCAL
returnType = referencedFunction.returnType returnType = referencedFunction.returnType
isSuspend = false isSuspend = referencedFunction.isSuspend
}.apply { }.apply {
for ((index, argumentType) in argumentTypes.withIndex()) { for ((index, argumentType) in argumentTypes.withIndex()) {
addValueParameter { addValueParameter {
@@ -137,12 +137,12 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
} }
body = this@InlineCallableReferenceToLambdaPhase.context.createJvmIrBuilder( body = this@InlineCallableReferenceToLambdaPhase.context.createJvmIrBuilder(
this.symbol, symbol,
expression.startOffset, expression.startOffset,
expression.endOffset expression.endOffset
).run { ).run {
irExprBody(irCall(referencedFunction).apply { irExprBody(irCall(referencedFunction).apply {
this@apply.symbol.owner.allTypeParameters.forEach { symbol.owner.allTypeParameters.forEach {
putTypeArgument(it.index, expression.getTypeArgument(it.index)) putTypeArgument(it.index, expression.getTypeArgument(it.index))
} }
@@ -1,6 +1,6 @@
// !LANGUAGE: +ReleaseCoroutines // !LANGUAGE: +ReleaseCoroutines
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM_IR, JS_IR, NATIVE // IGNORE_BACKEND: JS_IR, NATIVE
// WITH_RUNTIME // WITH_RUNTIME
// WITH_COROUTINES // WITH_COROUTINES
import helpers.* import helpers.*
@@ -1,6 +1,4 @@
// !LANGUAGE: +ReleaseCoroutines // !LANGUAGE: +ReleaseCoroutines
// IGNORE_BACKEND: JVM_IR
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
// NO_CHECK_LAMBDA_INLINING // NO_CHECK_LAMBDA_INLINING
// FILE: test.kt // FILE: test.kt