JVM_IR: Support inner lambdas which capture crossinline
This commit is contained in:
@@ -131,6 +131,12 @@ class MethodInliner(
|
|||||||
|
|
||||||
processReturns(resultNode, returnLabelOwner, remapReturn, end)
|
processReturns(resultNode, returnLabelOwner, remapReturn, end)
|
||||||
//flush transformed node to output
|
//flush transformed node to output
|
||||||
|
// TODO: HACK resultNode's invisibleParameterAnnotations' size is greater than adapter's
|
||||||
|
if (resultNode.name == "<init>" && resultNode.desc.contains("Lkotlin/coroutines/Continuation;") &&
|
||||||
|
inliningContext.root.state.isIrBackend
|
||||||
|
) {
|
||||||
|
resultNode.invisibleParameterAnnotations = null
|
||||||
|
}
|
||||||
resultNode.accept(SkipMaxAndEndVisitor(adapter))
|
resultNode.accept(SkipMaxAndEndVisitor(adapter))
|
||||||
|
|
||||||
sourceMapper.endMapping()
|
sourceMapper.endMapping()
|
||||||
|
|||||||
+10
-1
@@ -652,11 +652,20 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
|
|||||||
expression.acceptChildrenVoid(this)
|
expression.acceptChildrenVoid(this)
|
||||||
|
|
||||||
if (expression.isSuspend && expression !in inlineLambdas && expression.origin == IrStatementOrigin.LAMBDA) {
|
if (expression.isSuspend && expression !in inlineLambdas && expression.origin == IrStatementOrigin.LAMBDA) {
|
||||||
|
var expressionCapturesCrossinline = false
|
||||||
|
for (i in 0 until expression.valueArgumentsCount) {
|
||||||
|
val getValue = expression.getValueArgument(i) as? IrGetValue ?: continue
|
||||||
|
val owner = getValue.symbol.owner as? IrValueParameter ?: continue
|
||||||
|
if (owner.isCrossinline) {
|
||||||
|
expressionCapturesCrossinline = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
suspendLambdas += SuspendLambdaInfo(
|
suspendLambdas += SuspendLambdaInfo(
|
||||||
expression.symbol.owner,
|
expression.symbol.owner,
|
||||||
(expression.type as IrSimpleType).arguments.size - 1,
|
(expression.type as IrSimpleType).arguments.size - 1,
|
||||||
expression,
|
expression,
|
||||||
expression in capturesCrossinline
|
expressionCapturesCrossinline || expression in capturesCrossinline
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
|
||||||
// FILE: test.kt
|
// FILE: test.kt
|
||||||
// COMMON_COROUTINES_TEST
|
// COMMON_COROUTINES_TEST
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
|
||||||
// FILE: inlined.kt
|
// FILE: inlined.kt
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// NO_CHECK_LAMBDA_INLINING
|
// NO_CHECK_LAMBDA_INLINING
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
|
||||||
// FILE: inlined.kt
|
// FILE: inlined.kt
|
||||||
// COMMON_COROUTINES_TEST
|
// COMMON_COROUTINES_TEST
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-2
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
|
||||||
// FILE: inlined.kt
|
// FILE: inlined.kt
|
||||||
// COMMON_COROUTINES_TEST
|
// COMMON_COROUTINES_TEST
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
// IGNORE_BACKEND_MULTI_MODULE: JVM_IR
|
||||||
// COMMON_COROUTINES_TEST
|
// COMMON_COROUTINES_TEST
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
Reference in New Issue
Block a user