[JS IR BE] Fix unbound symbols after deserialization

* restore broken psi2ir invariant
This commit is contained in:
Roman Artemev
2019-03-20 20:13:31 +03:00
committed by romanart
parent 58189c79ca
commit 538512fa2a
3 changed files with 14 additions and 5 deletions
@@ -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)
@@ -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) }
}
}
}
@@ -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")