[KLIB] Use queue to track classes required fake override resolve

- Avoid module visiting to prevent lazy bodies loading
This commit is contained in:
Roman Artemev
2020-07-06 18:44:44 +03:00
committed by romanart
parent 2b0639d4ad
commit bb20e4759b
3 changed files with 18 additions and 25 deletions
@@ -170,21 +170,8 @@ class FakeOverrideBuilder(
}
}
fun provideFakeOverrides(module: IrModuleFragment) {
module.acceptVoid(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
}
override fun visitClass(declaration: IrClass) {
buildFakeOverrideChainsForClass(declaration)
haveFakeOverrides.add(declaration)
super.visitClass(declaration)
}
override fun visitFunction(declaration: IrFunction) {
// Don't go for function local classes
}
})
fun provideFakeOverrides(klass: IrClass) {
buildFakeOverrideChainsForClass(klass)
haveFakeOverrides.add(klass)
}
}
@@ -110,7 +110,8 @@ abstract class IrFileDeserializer(
val builtIns: IrBuiltIns,
val symbolTable: SymbolTable,
protected var deserializeBodies: Boolean,
private val deserializeFakeOverrides: Boolean
private val deserializeFakeOverrides: Boolean,
private val fakeOverrideQueue: MutableList<IrClass>
) {
abstract fun deserializeIrSymbolToDeclare(code: Long): Pair<IrSymbol, IdSignature>
@@ -1051,6 +1052,12 @@ abstract class IrFileDeserializer(
thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1)
(descriptor as? WrappedClassDescriptor)?.bind(this)
if (!deserializeFakeOverrides) {
if (symbol.isPublicApi) {
fakeOverrideQueue.add(this)
}
}
}
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -71,6 +72,7 @@ abstract class KotlinIrLinker(
abstract val fakeOverrideBuilder: FakeOverrideBuilder
private val haveSeen = mutableSetOf<IrSymbol>()
private val fakeOverrideClassQueue = mutableListOf<IrClass>()
private lateinit var linkerExtensions: Collection<IrDeserializer.IrLinkerExtension>
@@ -228,7 +230,7 @@ abstract class KotlinIrLinker(
inlineBodies: Boolean,
deserializeFakeOverrides: Boolean,
private val moduleDeserializer: IrModuleDeserializer
) : IrFileDeserializer(logger, builtIns, symbolTable, !onlyHeaders, deserializeFakeOverrides) {
) : IrFileDeserializer(logger, builtIns, symbolTable, !onlyHeaders, deserializeFakeOverrides, fakeOverrideClassQueue) {
private var fileLoops = mutableMapOf<Int, IrLoop>()
@@ -588,13 +590,10 @@ abstract class KotlinIrLinker(
override fun postProcess() {
finalizeExpectActualLinker()
if (!deserializeFakeOverrides) {
deserializersForModules.values.forEach {
it.postProcess {
fakeOverrideBuilder.provideFakeOverrides(it)
}
}
while (fakeOverrideClassQueue.isNotEmpty()) {
val klass = fakeOverrideClassQueue.removeLast()
fakeOverrideBuilder.provideFakeOverrides(klass)
}
// TODO: fix IrPluginContext to make it not produce additional external reference