From 8782399ffbcd8c5433265fc29be19fc47a1a05e4 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Tue, 20 Jul 2021 14:27:22 +0300 Subject: [PATCH] [JS IC] Make sure already bound symbol is not being enqueued --- .../ir/backend/js/ic/IcFileDeserializer.kt | 16 ++++++---- .../ir/backend/js/ic/IcModuleDeserializer.kt | 29 +++++++++++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt index e0c0be9130e..7675b703be5 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt @@ -83,13 +83,17 @@ class IcFileDeserializer( val topLevelSig = idSig.topLevelSignature() if (idSig in originalFileDeserializer.reversedSignatureIndex) { - topLevelSig.originalEnqueue(this) - idSig.enqueue(this) - linker.modulesWithReachableTopLevels.add(moduleDeserializer) - - return originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also { + val symbol = originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also { linker.deserializedSymbols.add(it) } + + if (!symbol.isBound) { + topLevelSig.originalEnqueue(this) + idSig.enqueue(this) + linker.modulesWithReachableTopLevels.add(moduleDeserializer) + } + + return symbol } else { val actualModuleDeserializer = @@ -174,7 +178,7 @@ class IcFileDeserializer( private val carrierDeserializer by lazy { CarrierDeserializer(declarationDeserializer, icFileData.carriers) } - val reversedSignatureIndex: Map by lazy { protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap() } + val reversedSignatureIndex: Map = protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap() val visited = HashSet() diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt index 2f52cb3d19d..2f5d8b41b66 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt @@ -106,13 +106,17 @@ class IcModuleDeserializer( val icDeserializer = moduleReversedFileIndex[topLevelSignature] ?: error("No file for $topLevelSignature (@ $idSig) in module $moduleDescriptor") - topLevelSignature.originalEnqueue(icDeserializer) - idSig.enqueue(icDeserializer) - linker.modulesWithReachableTopLevels.add(this) - - return icDeserializer.originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also { + val symbol = icDeserializer.originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also { linker.deserializedSymbols.add(it) } + + if (!symbol.isBound) { + topLevelSignature.originalEnqueue(icDeserializer) + idSig.enqueue(icDeserializer) + linker.modulesWithReachableTopLevels.add(this) + } + + return symbol } override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, linker.builtIns, emptyList()) @@ -209,14 +213,15 @@ class IcModuleDeserializer( override fun postProcess() { icDeserializers.forEach { icDeserializer -> - if (!icDeserializer.visited.isEmpty()) { - val file = icDeserializer.originalFileDeserializer.file - icDeserializer.init() - icDeserializer.reversedSignatureIndex.keys.forEach { - if (it in icModuleReversedFileIndex) error("Duplicate signature $it in both ${icModuleReversedFileIndex[it]!!.originalFileDeserializer.file.path} and in ${file.path}") - - icModuleReversedFileIndex[it] = icDeserializer + val file = icDeserializer.originalFileDeserializer.file + icDeserializer.init() + icDeserializer.reversedSignatureIndex.keys.forEach { + if (it in icModuleReversedFileIndex) { + val existed = icModuleReversedFileIndex[it]!! + error("Duplicate signature $it in both ${existed.originalFileDeserializer.file.path} and in ${file.path}") } + + icModuleReversedFileIndex[it] = icDeserializer } }