From 538512fa2a237d1fdf9b81bcedef5aa446e41956 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Wed, 20 Mar 2019 20:13:31 +0300 Subject: [PATCH] [JS IR BE] Fix unbound symbols after deserialization * restore broken psi2ir invariant --- .../jetbrains/kotlin/ir/backend/js/compiler.kt | 2 +- .../js/lower/serialization/ir/JsIrLinker.kt | 15 +++++++++++++-- .../ir/util/ExternalDependenciesGenerator.kt | 2 -- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index e7747cdc5fe..35a61fe07a9 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -138,7 +138,7 @@ fun compile( val psi2IrContext = psi2IrTranslator.createGeneratorContext(moduleDescriptor, analysisResult.bindingContext, symbolTable) val irBuiltIns = psi2IrContext.irBuiltIns - var deserializer = JsIrLinker(moduleDescriptor, logggg, irBuiltIns, symbolTable) + val deserializer = JsIrLinker(moduleDescriptor, logggg, irBuiltIns, symbolTable) val deserializedModuleFragments = sortedImmediateDependencies.map { val moduleFile = File(it.klibPath, moduleHeaderFileName) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index 827f9760c66..c95f53f1531 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -10,8 +10,6 @@ import org.jetbrains.kotlin.backend.common.library.CombinedIrFileReader import org.jetbrains.kotlin.backend.common.library.DeclarationId import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.backend.common.serialization.knownBuiltins -import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol @@ -49,4 +47,17 @@ class JsIrLinker( moduleToReaderMap[moduleDescriptor] = CombinedIrFileReader(irFile) return deserializeIrModuleHeader(moduleDescriptor, byteArray, deserializationStrategy) } + + override fun declareForwardDeclarations() { + // since for `knownBuiltIns` such as FunctionN it is possible to have unbound symbols after deserialization + // reference them through out lazy symbol table + with(symbolTable) { + ArrayList(unboundClasses).forEach { lazyWrapper.referenceClass(it.descriptor) } + ArrayList(unboundConstructors).forEach { lazyWrapper.referenceConstructor(it.descriptor) } + ArrayList(unboundEnumEntries).forEach { lazyWrapper.referenceEnumEntry(it.descriptor) } + ArrayList(unboundFields).forEach { lazyWrapper.referenceField(it.descriptor) } + ArrayList(unboundSimpleFunctions).forEach { lazyWrapper.referenceSimpleFunction(it.descriptor) } + ArrayList(unboundTypeParameters).forEach { lazyWrapper.referenceTypeParameter(it.descriptor) } + } + } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt index ba809ecdbe3..c4214715a23 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExternalDependenciesGenerator.kt @@ -60,8 +60,6 @@ class ExternalDependenciesGenerator( deserializer?.declareForwardDeclarations() - if (deserializer != null) return - assertEmpty(symbolTable.unboundClasses, "classes") assertEmpty(symbolTable.unboundConstructors, "constructors") assertEmpty(symbolTable.unboundEnumEntries, "enum entries")