[JS IC] Make sure already bound symbol is not being enqueued

This commit is contained in:
Roman Artemev
2021-07-20 14:27:22 +03:00
committed by teamcityserver
parent 334e34b70b
commit 8782399ffb
2 changed files with 27 additions and 18 deletions
@@ -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<IdSignature, Int> by lazy { protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap() }
val reversedSignatureIndex: Map<IdSignature, Int> = protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap()
val visited = HashSet<IdSignature>()
@@ -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
}
}