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,
|
moduleDescriptor: ModuleDescriptor,
|
||||||
override val klib: IrLibrary,
|
override val klib: IrLibrary,
|
||||||
override val strategy: DeserializationStrategy,
|
override val strategy: DeserializationStrategy,
|
||||||
private val containsErrorCode: Boolean = false
|
private val containsErrorCode: Boolean = false,
|
||||||
) :
|
) :
|
||||||
IrModuleDeserializer(moduleDescriptor) {
|
IrModuleDeserializer(moduleDescriptor) {
|
||||||
|
|
||||||
@@ -134,18 +134,21 @@ abstract class BasicIrModuleDeserializer(
|
|||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO useless
|
|
||||||
override fun addModuleReachableTopLevel(idSig: IdSignature) {
|
override fun addModuleReachableTopLevel(idSig: IdSignature) {
|
||||||
moduleDeserializationState.addIdSignature(idSig)
|
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>()
|
private val filesWithPendingTopLevels = mutableSetOf<FileDeserializationState>()
|
||||||
|
|
||||||
fun enqueueFile(fileDeserializationState: FileDeserializationState) {
|
fun enqueueFile(fileDeserializationState: FileDeserializationState) {
|
||||||
filesWithPendingTopLevels.add(fileDeserializationState)
|
filesWithPendingTopLevels.add(fileDeserializationState)
|
||||||
linker.modulesWithReachableTopLevels.add(this)
|
linker.modulesWithReachableTopLevels.add(moduleDeserializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addIdSignature(key: IdSignature) {
|
fun addIdSignature(key: IdSignature) {
|
||||||
|
|||||||
+4
@@ -100,6 +100,10 @@ class CurrentModuleWithICDeserializer(
|
|||||||
icDeserializer.addModuleReachableTopLevel(idSig)
|
icDeserializer.addModuleReachableTopLevel(idSig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun deserializeReachableDeclarations() {
|
||||||
|
icDeserializer.deserializeReachableDeclarations()
|
||||||
|
}
|
||||||
|
|
||||||
private fun DeclarationDescriptor.isDirtyDescriptor(): Boolean {
|
private fun DeclarationDescriptor.isDirtyDescriptor(): Boolean {
|
||||||
if (this is PropertyAccessorDescriptor) return correspondingProperty.isDirtyDescriptor()
|
if (this is PropertyAccessorDescriptor) return correspondingProperty.isDirtyDescriptor()
|
||||||
// Since descriptors for FO methods of `kotlin.Any` (toString, equals, hashCode) are Deserialized even in
|
// 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 addModuleReachableTopLevel(idSig: IdSignature) { error("Unsupported Operation (sig: $idSig") }
|
||||||
|
|
||||||
|
open fun deserializeReachableDeclarations() { error("Unsupported Operation") }
|
||||||
|
|
||||||
abstract val moduleFragment: IrModuleFragment
|
abstract val moduleFragment: IrModuleFragment
|
||||||
|
|
||||||
abstract val moduleDependencies: Collection<IrModuleDeserializer>
|
abstract val moduleDependencies: Collection<IrModuleDeserializer>
|
||||||
@@ -101,6 +103,10 @@ class IrModuleDeserializerWithBuiltIns(
|
|||||||
override fun referencePropertyByLocalSignature(file: IrFile, idSignature: IdSignature): IrPropertySymbol =
|
override fun referencePropertyByLocalSignature(file: IrFile, idSignature: IdSignature): IrPropertySymbol =
|
||||||
delegate.referencePropertyByLocalSignature(file, idSignature)
|
delegate.referencePropertyByLocalSignature(file, idSignature)
|
||||||
|
|
||||||
|
override fun deserializeReachableDeclarations() {
|
||||||
|
delegate.deserializeReachableDeclarations()
|
||||||
|
}
|
||||||
|
|
||||||
private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor {
|
private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor {
|
||||||
val isK = className[0] == 'K'
|
val isK = className[0] == 'K'
|
||||||
val isSuspend = (if (isK) className[1] else className[0]) == 'S'
|
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.builders.TranslationPluginContext
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
|
import org.jetbrains.kotlin.ir.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
|
||||||
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
|
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
|
||||||
import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException
|
import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
@@ -42,7 +41,7 @@ abstract class KotlinIrLinker(
|
|||||||
internal val expectSymbols = mutableMapOf<IdSignature, IrSymbol>()
|
internal val expectSymbols = mutableMapOf<IdSignature, IrSymbol>()
|
||||||
internal val actualSymbols = 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>
|
// TODO: replace with Map<Name, IrModuleDeserializer>
|
||||||
protected val deserializersForModules = mutableMapOf<ModuleDescriptor, IrModuleDeserializer>()
|
protected val deserializersForModules = mutableMapOf<ModuleDescriptor, IrModuleDeserializer>()
|
||||||
@@ -97,10 +96,10 @@ abstract class KotlinIrLinker(
|
|||||||
|
|
||||||
private fun deserializeAllReachableTopLevels() {
|
private fun deserializeAllReachableTopLevels() {
|
||||||
while (modulesWithReachableTopLevels.isNotEmpty()) {
|
while (modulesWithReachableTopLevels.isNotEmpty()) {
|
||||||
val moduleDeserializationState = modulesWithReachableTopLevels.first()
|
val moduleDeserializer = modulesWithReachableTopLevels.first()
|
||||||
modulesWithReachableTopLevels.remove(moduleDeserializationState)
|
modulesWithReachableTopLevels.remove(moduleDeserializer)
|
||||||
|
|
||||||
moduleDeserializationState.deserializeReachableDeclarations()
|
moduleDeserializer.deserializeReachableDeclarations()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user