From 626c94c54dcbdc0c20aa114242f3df1d381c8bcf Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 8 Apr 2020 16:07:14 +0300 Subject: [PATCH] [IR] Fixed bug with redundant creation of Ref<> in inline lambdas --- .../common/lower/SharedVariablesLowering.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt index a6d06ff7d2c..02008dfc8f1 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.util.dump -import org.jetbrains.kotlin.ir.util.getArgumentsWithIr import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -58,6 +57,7 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass { } private fun collectSharedVariables() { + val skippedFunctionsParents = mutableMapOf() irBody.accept(object : IrElementVisitor { val relevantVars = HashSet() val relevantVals = HashSet() @@ -82,15 +82,18 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass { // may be it's their fault? && !param.isCrossinline && arg is IrFunctionExpression - ) + ) { + skippedFunctionsParents[arg.function] = data!! arg.function.acceptChildren(this, data) - else + skippedFunctionsParents.remove(arg.function) + } else arg.accept(this, data) } } - override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) = + override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) { super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data) + } override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent?) { declaration.acceptChildren(this, data) @@ -110,7 +113,7 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass { expression.acceptChildren(this, data) val value = expression.symbol.owner - if (value in relevantVars && (value as IrVariable).parent != data) { + if (value in relevantVars && getRealParent(value as IrVariable) != data) { sharedVariables.add(value) } } @@ -119,10 +122,14 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass { super.visitSetVariable(expression, data) val variable = expression.symbol.owner - if (variable.initializer == null && variable.parent != data && variable in relevantVals) { + if (variable.initializer == null && getRealParent(variable) != data && variable in relevantVals) { sharedVariables.add(variable) } } + + private fun getRealParent(variable: IrVariable) = + variable.parent.let { skippedFunctionsParents[it] ?: it } + }, irDeclaration as? IrDeclarationParent ?: irDeclaration.parent) }