KLIB: queue modules instead of ModuleDeserializationState
This approach is more general and expandable.
This commit is contained in:
+7
-4
@@ -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) {
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
+6
@@ -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'
|
||||
|
||||
+5
-6
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user