IR: refactor IdSignatureSerializer
Use a separate instance for each file.
This commit is contained in:
+9
-7
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.common.overrides
|
||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.overrides.FakeOverrideBuilderStrategy
|
||||
@@ -28,18 +29,19 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
|
||||
import org.jetbrains.kotlin.ir.types.getClass
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
|
||||
class FakeOverrideGlobalDeclarationTable(
|
||||
signatureSerializer: IdSignatureSerializer
|
||||
) : GlobalDeclarationTable(signatureSerializer, signatureSerializer.mangler) {
|
||||
mangler: KotlinMangler.IrMangler
|
||||
) : GlobalDeclarationTable(mangler) {
|
||||
fun clear() = table.clear()
|
||||
}
|
||||
|
||||
class FakeOverrideDeclarationTable(
|
||||
signatureSerializer: IdSignatureSerializer,
|
||||
globalTable: FakeOverrideGlobalDeclarationTable = FakeOverrideGlobalDeclarationTable(signatureSerializer)
|
||||
mangler: KotlinMangler.IrMangler,
|
||||
globalTable: FakeOverrideGlobalDeclarationTable = FakeOverrideGlobalDeclarationTable(mangler)
|
||||
) : DeclarationTable(globalTable) {
|
||||
override val globalDeclarationTable: FakeOverrideGlobalDeclarationTable = globalTable
|
||||
fun clear() {
|
||||
@@ -64,7 +66,7 @@ object DefaultFakeOverrideClassFilter : FakeOverrideClassFilter {
|
||||
class FakeOverrideBuilder(
|
||||
val linker: FileLocalAwareLinker,
|
||||
val symbolTable: SymbolTable,
|
||||
val signaturer: IdSignatureSerializer,
|
||||
mangler: KotlinMangler.IrMangler,
|
||||
irBuiltIns: IrBuiltIns,
|
||||
val platformSpecificClassFilter: FakeOverrideClassFilter = DefaultFakeOverrideClassFilter
|
||||
) : FakeOverrideBuilderStrategy() {
|
||||
@@ -73,7 +75,7 @@ class FakeOverrideBuilder(
|
||||
private val irOverridingUtil = IrOverridingUtil(irBuiltIns, this)
|
||||
|
||||
// TODO: The declaration table is needed for the signaturer.
|
||||
private val fakeOverrideDeclarationTable = FakeOverrideDeclarationTable(signaturer)
|
||||
private val fakeOverrideDeclarationTable = FakeOverrideDeclarationTable(mangler)
|
||||
|
||||
private val fakeOverrideClassQueue = mutableListOf<IrClass>()
|
||||
fun enqueueClass(clazz: IrClass, signature: IdSignature) {
|
||||
@@ -135,7 +137,7 @@ class FakeOverrideBuilder(
|
||||
}
|
||||
|
||||
private fun composeSignature(declaration: IrDeclaration) =
|
||||
signaturer.composeSignatureForDeclaration(declaration)
|
||||
fakeOverrideDeclarationTable.signaturer.composeSignatureForDeclaration(declaration)
|
||||
|
||||
private fun declareFunctionFakeOverride(declaration: IrFakeOverrideFunction, signature: IdSignature) {
|
||||
val parent = declaration.parentAsClass
|
||||
|
||||
+6
-8
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.backend.common.serialization
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
@@ -25,14 +26,14 @@ interface IdSignatureClashTracker {
|
||||
}
|
||||
|
||||
abstract class GlobalDeclarationTable(
|
||||
val signaturer: IdSignatureSerializer,
|
||||
private val mangler: KotlinMangler.IrMangler,
|
||||
private val clashTracker: IdSignatureClashTracker
|
||||
) {
|
||||
val publicIdSignatureComputer = PublicIdSignatureComputer(mangler)
|
||||
|
||||
protected val table = mutableMapOf<IrDeclaration, IdSignature>()
|
||||
|
||||
constructor(signaturer: IdSignatureSerializer, mangler: KotlinMangler.IrMangler) :
|
||||
this(signaturer, mangler, IdSignatureClashTracker.DEFAULT_TRACKER)
|
||||
constructor(mangler: KotlinMangler.IrMangler) : this(mangler, IdSignatureClashTracker.DEFAULT_TRACKER)
|
||||
|
||||
protected fun loadKnownBuiltins(builtIns: IrBuiltIns) {
|
||||
builtIns.knownBuiltins.forEach {
|
||||
@@ -43,7 +44,7 @@ abstract class GlobalDeclarationTable(
|
||||
|
||||
open fun computeSignatureByDeclaration(declaration: IrDeclaration): IdSignature {
|
||||
return table.getOrPut(declaration) {
|
||||
signaturer.composePublicIdSignature(declaration).also { clashTracker.commit(declaration, it) }
|
||||
publicIdSignatureComputer.composePublicIdSignature(declaration).also { clashTracker.commit(declaration, it) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,10 +55,7 @@ open class DeclarationTable(globalTable: GlobalDeclarationTable) {
|
||||
protected val table = mutableMapOf<IrDeclaration, IdSignature>()
|
||||
protected open val globalDeclarationTable: GlobalDeclarationTable = globalTable
|
||||
// TODO: we need to disentangle signature construction with declaration tables.
|
||||
private val signaturer: IdSignatureSerializer = globalTable.signaturer.also {
|
||||
it.reset()
|
||||
it.table = this
|
||||
}
|
||||
open val signaturer: IdSignatureSerializer = IdSignatureSerializer(globalTable.publicIdSignatureComputer, this)
|
||||
|
||||
private fun IrDeclaration.isLocalDeclaration(): Boolean {
|
||||
return !isExportedDeclaration(this)
|
||||
|
||||
+33
-25
@@ -16,29 +16,22 @@ import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
|
||||
open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSignatureComputer {
|
||||
class PublicIdSignatureComputer(val mangler: KotlinMangler.IrMangler) : IdSignatureComputer {
|
||||
|
||||
private val publicSignatureBuilder = PublicIdSigBuilder()
|
||||
|
||||
override fun computeSignature(declaration: IrDeclaration): IdSignature? {
|
||||
return if (mangler.run { declaration.isExported() }) {
|
||||
composePublicIdSignature(declaration)
|
||||
publicSignatureBuilder.buildSignature(declaration)
|
||||
} else null
|
||||
}
|
||||
|
||||
fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
||||
return if (mangler.run { declaration.isExported() }) {
|
||||
composePublicIdSignature(declaration)
|
||||
} else composeFileLocalIdSignature(declaration)
|
||||
}
|
||||
fun composePublicIdSignature(declaration: IrDeclaration): IdSignature {
|
||||
assert(mangler.run { declaration.isExported() }) {
|
||||
"${declaration.render()} expected to be exported"
|
||||
}
|
||||
|
||||
private var localIndex: Long = 0
|
||||
private var scopeIndex: Int = 0
|
||||
|
||||
// TODO: we need to disentangle signature construction with declaration tables.
|
||||
lateinit var table: DeclarationTable
|
||||
|
||||
fun reset() {
|
||||
localIndex = 0
|
||||
scopeIndex = 0
|
||||
return publicSignatureBuilder.buildSignature(declaration)
|
||||
}
|
||||
|
||||
private inner class PublicIdSigBuilder : IdSignatureBuilder<IrDeclaration>(), IrElementVisitorVoid {
|
||||
@@ -96,8 +89,31 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
||||
collectFqNames(declaration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val publicSignatureBuilder = PublicIdSigBuilder()
|
||||
open class IdSignatureSerializer(
|
||||
private val publicSignatureBuilder: PublicIdSignatureComputer,
|
||||
private val table: DeclarationTable,
|
||||
localIndexOffset: Long = 0,
|
||||
scopeIndexOffset: Int = 0,
|
||||
) : IdSignatureComputer {
|
||||
|
||||
private val mangler: KotlinMangler.IrMangler = publicSignatureBuilder.mangler
|
||||
|
||||
override fun computeSignature(declaration: IrDeclaration): IdSignature? {
|
||||
return if (mangler.run { declaration.isExported() }) {
|
||||
publicSignatureBuilder.composePublicIdSignature(declaration)
|
||||
} else null
|
||||
}
|
||||
|
||||
fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
||||
return if (mangler.run { declaration.isExported() }) {
|
||||
publicSignatureBuilder.composePublicIdSignature(declaration)
|
||||
} else composeFileLocalIdSignature(declaration)
|
||||
}
|
||||
|
||||
private var localIndex: Long = localIndexOffset
|
||||
private var scopeIndex: Int = scopeIndexOffset
|
||||
|
||||
private fun composeContainerIdSignature(container: IrDeclarationParent): IdSignature =
|
||||
when (container) {
|
||||
@@ -106,14 +122,6 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
||||
else -> error("Unexpected container ${container.render()}")
|
||||
}
|
||||
|
||||
fun composePublicIdSignature(declaration: IrDeclaration): IdSignature {
|
||||
assert(mangler.run { declaration.isExported() }) {
|
||||
"${declaration.render()} expected to be exported"
|
||||
}
|
||||
|
||||
return publicSignatureBuilder.buildSignature(declaration)
|
||||
}
|
||||
|
||||
fun composeFileLocalIdSignature(declaration: IrDeclaration): IdSignature {
|
||||
assert(!mangler.run { declaration.isExported() })
|
||||
|
||||
|
||||
Reference in New Issue
Block a user