[JS IR]Add check on pureness to not calculate fields to expression twice

^KT-43222 fixed
This commit is contained in:
Ilya Goncharov
2020-11-16 13:49:09 +03:00
parent aa0f9dc1e2
commit fcb3ee5e45
2 changed files with 8 additions and 9 deletions
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.backend.common.DefaultMapping import org.jetbrains.kotlin.backend.common.DefaultMapping
import org.jetbrains.kotlin.backend.common.Mapping import org.jetbrains.kotlin.backend.common.Mapping
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
class JsMapping : DefaultMapping() { class JsMapping : DefaultMapping() {
val outerThisFieldSymbols = newMapping<IrClass, IrField>() val outerThisFieldSymbols = newMapping<IrClass, IrField>()
@@ -32,8 +30,6 @@ class JsMapping : DefaultMapping() {
val enumEntryToCorrespondingField = newMapping<IrEnumEntry, IrField>() val enumEntryToCorrespondingField = newMapping<IrEnumEntry, IrField>()
val enumClassToInitEntryInstancesFun = newMapping<IrClass, IrSimpleFunction>() val enumClassToInitEntryInstancesFun = newMapping<IrClass, IrSimpleFunction>()
val lazyInitialisedFields = newMapping<IrField, IrExpression>()
// Triggers `StageController.lazyLower` on access // Triggers `StageController.lazyLower` on access
override fun <K : IrDeclaration, V> newMapping(): Mapping.Delegate<K, V> = object : Mapping.Delegate<K, V>() { override fun <K : IrDeclaration, V> newMapping(): Mapping.Delegate<K, V> = object : Mapping.Delegate<K, V>() {
private val map: MutableMap<K, V> = mutableMapOf() private val map: MutableMap<K, V> = mutableMapOf()
@@ -51,11 +51,13 @@ class PropertyLazyInitLowering(
val file = container.parent as? IrFile val file = container.parent as? IrFile
?: return ?: return
val initFun = (if (file in fileToInitialisationFuns) { val initFun = (when {
fileToInitialisationFuns[file] file in fileToInitialisationFuns -> fileToInitialisationFuns[file]
} else { fileToPurenessInitializers[file] == true -> null
createInitialisationFunction(file).also { else -> {
fileToInitialisationFuns[file] = it createInitialisationFunction(file).also {
fileToInitialisationFuns[file] = it
}
} }
}) ?: return }) ?: return
@@ -95,6 +97,7 @@ class PropertyLazyInitLowering(
if (fieldToInitializer.isEmpty()) return null if (fieldToInitializer.isEmpty()) return null
val allFieldsInFilePure = allFieldsInFilePure(fieldToInitializer.values) val allFieldsInFilePure = allFieldsInFilePure(fieldToInitializer.values)
fileToPurenessInitializers[file] = allFieldsInFilePure
if (allFieldsInFilePure) { if (allFieldsInFilePure) {
return null return null
} }