diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 909650f882e..6987de40010 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -91,7 +91,7 @@ abstract class KotlinIrLinker( } class SimpleDeserializationState: DeserializationState() { - private val reachableTopLevels = mutableSetOf() + private val reachableTopLevels = LinkedHashSet() override fun addUniqID(key: UniqId) { reachableTopLevels.add(key) @@ -140,8 +140,11 @@ abstract class KotlinIrLinker( // This is a heavy initializer val module = deserializeIrModuleHeader() - inner class IrDeserializerForFile(private var annotations: List?, private var forcedDeclarations: List?, private val fileIndex: Int, onlyHeaders: Boolean) : - IrFileDeserializer(logger, builtIns, symbolTable) { + inner class IrDeserializerForFile( + private var annotations: List?, + private val fileIndex: Int, + onlyHeaders: Boolean + ) : IrFileDeserializer(logger, builtIns, symbolTable) { private var fileLoops = mutableMapOf() @@ -385,10 +388,6 @@ abstract class KotlinIrLinker( file.annotations.addAll(deserializeAnnotations(it)) annotations = null } - forcedDeclarations?.let { - it.forEach { fileLocalDeserializationState.addUniqID(it) } - forcedDeclarations = null - } } fun deserializeAllFileReachableTopLevel() { @@ -405,10 +404,14 @@ abstract class KotlinIrLinker( val fileEntry = NaiveSourceBasedFileEntryImpl(fileName, fileProto.fileEntry.lineStartOffsetsList.toIntArray()) - val explicitlyExported = mutableListOf() - val fileDeserializer = - IrDeserializerForFile(fileProto.annotationList, explicitlyExported, fileIndex, !deserializationStrategy.needBodies) + IrDeserializerForFile(fileProto.annotationList, fileIndex, !deserializationStrategy.needBodies).apply { + // Explicitly exported declarations (e.g. top-level initializers) must be deserialized before all other declarations. + // Thus we schedule their deserialization in deserializer's constructor. + fileProto.explicitlyExportedToCompilerList.forEach { + fileLocalDeserializationState.addUniqID(UniqId(loadSymbolData(it).topLevelUniqIdIndex)) + } + } val fqName = fileDeserializer.deserializeFqName(fileProto.fqNameList) @@ -426,10 +429,6 @@ abstract class KotlinIrLinker( moduleReversedFileIndex.getOrPut(it) { fileDeserializer } } - fileProto.explicitlyExportedToCompilerList.mapTo(explicitlyExported) { - UniqId(fileDeserializer.loadSymbolData(it).topLevelUniqIdIndex) - } - if (deserializationStrategy.theWholeWorld) { for (id in fileUniqIdIndex) { assert(id.isPublic)