KLIB: queue modules instead of ModuleDeserializationState

This approach is more general and expandable.
This commit is contained in:
Anton Bannykh
2021-06-27 22:36:02 +03:00
parent e4707b236b
commit aa5e7c65be
4 changed files with 22 additions and 10 deletions
@@ -25,7 +25,7 @@ abstract class BasicIrModuleDeserializer(
moduleDescriptor: ModuleDescriptor,
override val klib: IrLibrary,
override val strategy: DeserializationStrategy,
private val containsErrorCode: Boolean = false
private val containsErrorCode: Boolean = false,
) :
IrModuleDeserializer(moduleDescriptor) {
@@ -134,18 +134,21 @@ abstract class BasicIrModuleDeserializer(
return file
}
// TODO useless
override fun addModuleReachableTopLevel(idSig: IdSignature) {
moduleDeserializationState.addIdSignature(idSig)
}
override fun deserializeReachableDeclarations() {
moduleDeserializationState.deserializeReachableDeclarations()
}
}
internal class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) {
private class ModuleDeserializationState(val linker: KotlinIrLinker, val moduleDeserializer: BasicIrModuleDeserializer) {
private val filesWithPendingTopLevels = mutableSetOf<FileDeserializationState>()
fun enqueueFile(fileDeserializationState: FileDeserializationState) {
filesWithPendingTopLevels.add(fileDeserializationState)
linker.modulesWithReachableTopLevels.add(this)
linker.modulesWithReachableTopLevels.add(moduleDeserializer)
}
fun addIdSignature(key: IdSignature) {
@@ -100,6 +100,10 @@ class CurrentModuleWithICDeserializer(
icDeserializer.addModuleReachableTopLevel(idSig)
}
override fun deserializeReachableDeclarations() {
icDeserializer.deserializeReachableDeclarations()
}
private fun DeclarationDescriptor.isDirtyDescriptor(): Boolean {
if (this is PropertyAccessorDescriptor) return correspondingProperty.isDirtyDescriptor()
// Since descriptors for FO methods of `kotlin.Any` (toString, equals, hashCode) are Deserialized even in
@@ -55,6 +55,8 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor) {
open fun addModuleReachableTopLevel(idSig: IdSignature) { error("Unsupported Operation (sig: $idSig") }
open fun deserializeReachableDeclarations() { error("Unsupported Operation") }
abstract val moduleFragment: IrModuleFragment
abstract val moduleDependencies: Collection<IrModuleDeserializer>
@@ -101,6 +103,10 @@ class IrModuleDeserializerWithBuiltIns(
override fun referencePropertyByLocalSignature(file: IrFile, idSignature: IdSignature): IrPropertySymbol =
delegate.referencePropertyByLocalSignature(file, idSignature)
override fun deserializeReachableDeclarations() {
delegate.deserializeReachableDeclarations()
}
private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor {
val isK = className[0] == 'K'
val isSuspend = (if (isK) className[1] else className[0]) == 'S'
@@ -14,8 +14,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException
import org.jetbrains.kotlin.ir.symbols.*
@@ -42,7 +41,7 @@ abstract class KotlinIrLinker(
internal val expectSymbols = mutableMapOf<IdSignature, IrSymbol>()
internal val actualSymbols = mutableMapOf<IdSignature, IrSymbol>()
internal val modulesWithReachableTopLevels = mutableSetOf<ModuleDeserializationState>()
internal val modulesWithReachableTopLevels = mutableSetOf<IrModuleDeserializer>()
// TODO: replace with Map<Name, IrModuleDeserializer>
protected val deserializersForModules = mutableMapOf<ModuleDescriptor, IrModuleDeserializer>()
@@ -97,10 +96,10 @@ abstract class KotlinIrLinker(
private fun deserializeAllReachableTopLevels() {
while (modulesWithReachableTopLevels.isNotEmpty()) {
val moduleDeserializationState = modulesWithReachableTopLevels.first()
modulesWithReachableTopLevels.remove(moduleDeserializationState)
val moduleDeserializer = modulesWithReachableTopLevels.first()
modulesWithReachableTopLevels.remove(moduleDeserializer)
moduleDeserializationState.deserializeReachableDeclarations()
moduleDeserializer.deserializeReachableDeclarations()
}
}