[JS IR BE] Fix unbound symbols after deserialization
* restore broken psi2ir invariant
This commit is contained in:
@@ -138,7 +138,7 @@ fun compile(
|
|||||||
val psi2IrContext = psi2IrTranslator.createGeneratorContext(moduleDescriptor, analysisResult.bindingContext, symbolTable)
|
val psi2IrContext = psi2IrTranslator.createGeneratorContext(moduleDescriptor, analysisResult.bindingContext, symbolTable)
|
||||||
val irBuiltIns = psi2IrContext.irBuiltIns
|
val irBuiltIns = psi2IrContext.irBuiltIns
|
||||||
|
|
||||||
var deserializer = JsIrLinker(moduleDescriptor, logggg, irBuiltIns, symbolTable)
|
val deserializer = JsIrLinker(moduleDescriptor, logggg, irBuiltIns, symbolTable)
|
||||||
|
|
||||||
val deserializedModuleFragments = sortedImmediateDependencies.map {
|
val deserializedModuleFragments = sortedImmediateDependencies.map {
|
||||||
val moduleFile = File(it.klibPath, moduleHeaderFileName)
|
val moduleFile = File(it.klibPath, moduleHeaderFileName)
|
||||||
|
|||||||
+13
-2
@@ -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.library.DeclarationId
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.*
|
import org.jetbrains.kotlin.backend.common.serialization.*
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
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.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||||
@@ -49,4 +47,17 @@ class JsIrLinker(
|
|||||||
moduleToReaderMap[moduleDescriptor] = CombinedIrFileReader(irFile)
|
moduleToReaderMap[moduleDescriptor] = CombinedIrFileReader(irFile)
|
||||||
return deserializeIrModuleHeader(moduleDescriptor, byteArray, deserializationStrategy)
|
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()
|
deserializer?.declareForwardDeclarations()
|
||||||
|
|
||||||
if (deserializer != null) return
|
|
||||||
|
|
||||||
assertEmpty(symbolTable.unboundClasses, "classes")
|
assertEmpty(symbolTable.unboundClasses, "classes")
|
||||||
assertEmpty(symbolTable.unboundConstructors, "constructors")
|
assertEmpty(symbolTable.unboundConstructors, "constructors")
|
||||||
assertEmpty(symbolTable.unboundEnumEntries, "enum entries")
|
assertEmpty(symbolTable.unboundEnumEntries, "enum entries")
|
||||||
|
|||||||
Reference in New Issue
Block a user