[IR] Fixed bug with redundant creation of Ref<> in inline lambdas
This commit is contained in:
+13
-6
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.expressions.*
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.dump
|
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.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
@@ -58,6 +57,7 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun collectSharedVariables() {
|
private fun collectSharedVariables() {
|
||||||
|
val skippedFunctionsParents = mutableMapOf<IrFunction, IrDeclarationParent>()
|
||||||
irBody.accept(object : IrElementVisitor<Unit, IrDeclarationParent?> {
|
irBody.accept(object : IrElementVisitor<Unit, IrDeclarationParent?> {
|
||||||
val relevantVars = HashSet<IrVariable>()
|
val relevantVars = HashSet<IrVariable>()
|
||||||
val relevantVals = HashSet<IrVariable>()
|
val relevantVals = HashSet<IrVariable>()
|
||||||
@@ -82,15 +82,18 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
|
|||||||
// may be it's their fault?
|
// may be it's their fault?
|
||||||
&& !param.isCrossinline
|
&& !param.isCrossinline
|
||||||
&& arg is IrFunctionExpression
|
&& arg is IrFunctionExpression
|
||||||
)
|
) {
|
||||||
|
skippedFunctionsParents[arg.function] = data!!
|
||||||
arg.function.acceptChildren(this, data)
|
arg.function.acceptChildren(this, data)
|
||||||
else
|
skippedFunctionsParents.remove(arg.function)
|
||||||
|
} else
|
||||||
arg.accept(this, data)
|
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)
|
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent?) {
|
override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent?) {
|
||||||
declaration.acceptChildren(this, data)
|
declaration.acceptChildren(this, data)
|
||||||
@@ -110,7 +113,7 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
|
|||||||
expression.acceptChildren(this, data)
|
expression.acceptChildren(this, data)
|
||||||
|
|
||||||
val value = expression.symbol.owner
|
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)
|
sharedVariables.add(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,10 +122,14 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
|
|||||||
super.visitSetVariable(expression, data)
|
super.visitSetVariable(expression, data)
|
||||||
|
|
||||||
val variable = expression.symbol.owner
|
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)
|
sharedVariables.add(variable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getRealParent(variable: IrVariable) =
|
||||||
|
variable.parent.let { skippedFunctionsParents[it] ?: it }
|
||||||
|
|
||||||
}, irDeclaration as? IrDeclarationParent ?: irDeclaration.parent)
|
}, irDeclaration as? IrDeclarationParent ?: irDeclaration.parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user