[KLIB] Use queue to track classes required fake override resolve
- Avoid module visiting to prevent lazy bodies loading
This commit is contained in:
+3
-16
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-8
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user