[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() val topLevelSig = idSig.topLevelSignature()
if (idSig in originalFileDeserializer.reversedSignatureIndex) { if (idSig in originalFileDeserializer.reversedSignatureIndex) {
val symbol = originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also {
linker.deserializedSymbols.add(it)
}
if (!symbol.isBound) {
topLevelSig.originalEnqueue(this) topLevelSig.originalEnqueue(this)
idSig.enqueue(this) idSig.enqueue(this)
linker.modulesWithReachableTopLevels.add(moduleDeserializer) linker.modulesWithReachableTopLevels.add(moduleDeserializer)
return originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also {
linker.deserializedSymbols.add(it)
} }
return symbol
} else { } else {
val actualModuleDeserializer = val actualModuleDeserializer =
@@ -174,7 +178,7 @@ class IcFileDeserializer(
private val carrierDeserializer by lazy { CarrierDeserializer(declarationDeserializer, icFileData.carriers) } 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>() val visited = HashSet<IdSignature>()
@@ -106,13 +106,17 @@ class IcModuleDeserializer(
val icDeserializer = moduleReversedFileIndex[topLevelSignature] val icDeserializer = moduleReversedFileIndex[topLevelSignature]
?: error("No file for $topLevelSignature (@ $idSig) in module $moduleDescriptor") ?: error("No file for $topLevelSignature (@ $idSig) in module $moduleDescriptor")
val symbol = icDeserializer.originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also {
linker.deserializedSymbols.add(it)
}
if (!symbol.isBound) {
topLevelSignature.originalEnqueue(icDeserializer) topLevelSignature.originalEnqueue(icDeserializer)
idSig.enqueue(icDeserializer) idSig.enqueue(icDeserializer)
linker.modulesWithReachableTopLevels.add(this) linker.modulesWithReachableTopLevels.add(this)
return icDeserializer.originalFileDeserializer.symbolDeserializer.deserializeIrSymbol(idSig, symbolKind).also {
linker.deserializedSymbols.add(it)
} }
return symbol
} }
override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, linker.builtIns, emptyList()) override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, linker.builtIns, emptyList())
@@ -209,16 +213,17 @@ class IcModuleDeserializer(
override fun postProcess() { override fun postProcess() {
icDeserializers.forEach { icDeserializer -> icDeserializers.forEach { icDeserializer ->
if (!icDeserializer.visited.isEmpty()) {
val file = icDeserializer.originalFileDeserializer.file val file = icDeserializer.originalFileDeserializer.file
icDeserializer.init() icDeserializer.init()
icDeserializer.reversedSignatureIndex.keys.forEach { icDeserializer.reversedSignatureIndex.keys.forEach {
if (it in icModuleReversedFileIndex) error("Duplicate signature $it in both ${icModuleReversedFileIndex[it]!!.originalFileDeserializer.file.path} and in ${file.path}") 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 icModuleReversedFileIndex[it] = icDeserializer
} }
} }
}
while (signatureQueue.isNotEmpty()) { while (signatureQueue.isNotEmpty()) {
val icFileDeserializer = fileQueue.removeFirst() val icFileDeserializer = fileQueue.removeFirst()