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() })
|
||||
|
||||
|
||||
+3
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
|
||||
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker
|
||||
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.IrProperty
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
@@ -40,8 +41,8 @@ class JsUniqIdClashTracker : IdSignatureClashTracker {
|
||||
}
|
||||
}
|
||||
|
||||
class JsGlobalDeclarationTable(signatureSerializer: IdSignatureSerializer, builtIns: IrBuiltIns) :
|
||||
GlobalDeclarationTable(signatureSerializer, JsManglerIr, JsUniqIdClashTracker()) {
|
||||
class JsGlobalDeclarationTable(builtIns: IrBuiltIns) :
|
||||
GlobalDeclarationTable(JsManglerIr, JsUniqIdClashTracker()) {
|
||||
init {
|
||||
loadKnownBuiltins(builtIns)
|
||||
}
|
||||
|
||||
+2
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
|
||||
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder
|
||||
import 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.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
@@ -28,7 +29,7 @@ class JsIrLinker(
|
||||
private val icData: ICData? = null
|
||||
) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, emptyList()) {
|
||||
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(JsManglerIr), builtIns)
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JsManglerIr, builtIns)
|
||||
|
||||
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean =
|
||||
moduleDescriptor === moduleDescriptor.builtIns.builtInsModule
|
||||
|
||||
+2
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
|
||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
@@ -21,8 +22,7 @@ class JsIrModuleSerializer(
|
||||
val skipExpects: Boolean
|
||||
) : IrModuleSerializer<JsIrFileSerializer>(messageLogger) {
|
||||
|
||||
private val signaturer = IdSignatureSerializer(JsManglerIr)
|
||||
private val globalDeclarationTable = JsGlobalDeclarationTable(signaturer, irBuiltIns)
|
||||
private val globalDeclarationTable = JsGlobalDeclarationTable(irBuiltIns)
|
||||
|
||||
override fun createSerializerForFile(file: IrFile): JsIrFileSerializer =
|
||||
JsIrFileSerializer(messageLogger, DeclarationTable(globalDeclarationTable), expectDescriptorToSymbol, skipExpects = skipExpects)
|
||||
|
||||
+2
-1
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder
|
||||
import org.jetbrains.kotlin.backend.common.serialization.*
|
||||
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
@@ -43,7 +44,7 @@ class JvmIrLinker(
|
||||
private val manglerDesc: JvmManglerDesc
|
||||
) : KotlinIrLinker(currentModule, messageLogger, builtIns, symbolTable, emptyList()) {
|
||||
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(JvmManglerIr), builtIns)
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, JvmManglerIr, builtIns)
|
||||
|
||||
private val javaName = Name.identifier("java")
|
||||
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
|
||||
class KonanGlobalDeclarationTable(signatureSerializer: IdSignatureSerializer, builtIns: IrBuiltIns) : GlobalDeclarationTable(signatureSerializer, KonanManglerIr) {
|
||||
class KonanGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(KonanManglerIr) {
|
||||
init {
|
||||
loadKnownBuiltins(builtIns)
|
||||
}
|
||||
|
||||
+1
-2
@@ -16,8 +16,7 @@ class KonanIrModuleSerializer(
|
||||
val skipExpects: Boolean
|
||||
) : IrModuleSerializer<KonanIrFileSerializer>(messageLogger) {
|
||||
|
||||
private val signaturer = IdSignatureSerializer(KonanManglerIr)
|
||||
private val globalDeclarationTable = KonanGlobalDeclarationTable(signaturer, irBuiltIns)
|
||||
private val globalDeclarationTable = KonanGlobalDeclarationTable(irBuiltIns)
|
||||
|
||||
// We skip files with IR for C structs and enums because they should be
|
||||
// generated anew.
|
||||
|
||||
+1
-1
@@ -91,7 +91,7 @@ internal class KonanIrLinker(
|
||||
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean = moduleDescriptor.isNativeStdlib()
|
||||
|
||||
private val forwardDeclarationDeserializer = forwardModuleDescriptor?.let { KonanForwardDeclarationModuleDeserializer(it) }
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, IdSignatureSerializer(KonanManglerIr), builtIns, KonanFakeOverrideClassFilter)
|
||||
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, KonanManglerIr, builtIns, KonanFakeOverrideClassFilter)
|
||||
|
||||
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: IrLibrary?, strategy: DeserializationStrategy): IrModuleDeserializer {
|
||||
if (moduleDescriptor === forwardModuleDescriptor) {
|
||||
|
||||
Reference in New Issue
Block a user