[JS IC] Eradicate GlobalFileLocalSignature from code

- Reduce usage of global maps
This commit is contained in:
Roman Artemev
2021-07-27 18:49:45 +03:00
committed by teamcityserver
parent a0449892b2
commit 74d8e16d09
6 changed files with 22 additions and 81 deletions
@@ -338,34 +338,6 @@ sealed class IdSignature {
override fun hashCode(): Int = id
}
class GlobalFileLocalSignature(val container: IdSignature, val id: Long, val filePath: String) : IdSignature() {
override val isPubliclyVisible: Boolean get() = true
override fun packageFqName(): FqName = container.packageFqName()
override fun topLevelSignature(): IdSignature {
val topLevelContainer = container.topLevelSignature()
if (topLevelContainer === container) {
if (topLevelContainer is CommonSignature && topLevelContainer.declarationFqName.isEmpty()) {
// private top level
return this
}
}
return topLevelContainer
}
override fun nearestPublicSig(): IdSignature = container.nearestPublicSig()
override fun render(): String = "${container.render()}:$id from ${filePath.split('/').last()}"
override fun equals(other: Any?): Boolean =
other is GlobalFileLocalSignature && id == other.id && container == other.container && filePath == other.filePath
private val hashCode = (container.hashCode() * 31 + id.hashCode()) * 31 + filePath.hashCode()
override fun hashCode(): Int = hashCode
}
// Used to reference local variable and value parameters in function
class GlobalScopeLocalDeclaration(val id: Int, val description: String = "<no description>", val filePath: String) : IdSignature() {
override val isPubliclyVisible: Boolean get() = false
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.encodings.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrFileEntry
import org.jetbrains.kotlin.ir.declarations.*
@@ -28,11 +31,11 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.backend.common.serialization.proto.AccessorIdSignature as ProtoAccessorIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.Actual as ProtoActual
import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.CompositeSignature as ProtoCompositeSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.FieldAccessCommon as ProtoFieldAccessCommon
import org.jetbrains.kotlin.backend.common.serialization.proto.FileEntry as ProtoFileEntry
import org.jetbrains.kotlin.backend.common.serialization.proto.FileLocalIdSignature as ProtoFileLocalIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.ScopeLocalIdSignature as ProtoScopeLocalIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.FileSignature as ProtoFileSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
@@ -69,8 +72,6 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.IrFunction as Pro
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFunctionBase as ProtoFunctionBase
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFunctionExpression as ProtoFunctionExpression
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFunctionReference as ProtoFunctionReference
import org.jetbrains.kotlin.backend.common.serialization.proto.IrRawFunctionReference as ProtoRawFunctionReference
import org.jetbrains.kotlin.backend.common.serialization.proto.IrReturnableBlock as ProtoReturnableBlock
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetClass as ProtoGetClass
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetEnumValue as ProtoGetEnumValue
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetField as ProtoGetField
@@ -83,7 +84,9 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.IrLocalDelegatedP
import org.jetbrains.kotlin.backend.common.serialization.proto.IrOperation as ProtoOperation
import org.jetbrains.kotlin.backend.common.serialization.proto.IrProperty as ProtoProperty
import org.jetbrains.kotlin.backend.common.serialization.proto.IrPropertyReference as ProtoPropertyReference
import org.jetbrains.kotlin.backend.common.serialization.proto.IrRawFunctionReference as ProtoRawFunctionReference
import org.jetbrains.kotlin.backend.common.serialization.proto.IrReturn as ProtoReturn
import org.jetbrains.kotlin.backend.common.serialization.proto.IrReturnableBlock as ProtoReturnableBlock
import org.jetbrains.kotlin.backend.common.serialization.proto.IrReturnableBlockReturn as ProtoReturnableBlockReturn
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSetField as ProtoSetField
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSetValue as ProtoSetValue
@@ -109,10 +112,10 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhen as ProtoWh
import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhile as ProtoWhile
import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.Loop as ProtoLoop
import org.jetbrains.kotlin.backend.common.serialization.proto.LoweredIdSignature as ProtoLoweredIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.MemberAccessCommon as ProtoMemberAccessCommon
import org.jetbrains.kotlin.backend.common.serialization.proto.NullableIrExpression as ProtoNullableIrExpression
import org.jetbrains.kotlin.backend.common.serialization.proto.LoweredIdSignature as ProtoLoweredIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature
import org.jetbrains.kotlin.backend.common.serialization.proto.ScopeLocalIdSignature as ProtoScopeLocalIdSignature
open class IrFileSerializer(
val messageLogger: IrMessageLogger,
@@ -274,16 +277,6 @@ open class IrFileSerializer(
return proto.build()
}
private fun serializePrivateSignature(signature: IdSignature.GlobalFileLocalSignature): ProtoFileLocalIdSignature {
val proto = ProtoFileLocalIdSignature.newBuilder()
proto.container = protoIdSignature(signature.container)
proto.localId = signature.id
proto.file = serializeString(signature.filePath)
return proto.build()
}
private fun serializeScopeLocalSignature(signature: IdSignature.GlobalScopeLocalDeclaration): ProtoScopeLocalIdSignature {
val proto = ProtoScopeLocalIdSignature.newBuilder()
@@ -315,7 +308,6 @@ open class IrFileSerializer(
is IdSignature.FileSignature -> proto.fileSig = serializeFileSignature(idSignature)
// IR IC part
is IdSignature.LoweredDeclarationSignature -> proto.icSig = serializeLoweredDeclarationSignature(idSignature)
is IdSignature.GlobalFileLocalSignature -> proto.privateSig = serializePrivateSignature(idSignature)
is IdSignature.GlobalScopeLocalDeclaration -> proto.externalScopedLocalSig = serializeScopeLocalSignature(idSignature)
is IdSignature.SpecialFakeOverrideSignature -> {}
}
@@ -558,9 +550,10 @@ open class IrFileSerializer(
proto.addStatement(serializeStatement(it))
}
returnableBlock.inlineFunctionSymbol?.let {
proto.inlineFunctionSymbol = serializeIrSymbol(it)
}
// TODO: decided how should file reference be stored in IC cache
// returnableBlock.inlineFunctionSymbol?.let {
// proto.inlineFunctionSymbol = serializeIrSymbol(it)
// }
proto.build()
}
@@ -160,12 +160,7 @@ class IrSymbolDeserializer(
}
private fun deserializeFileLocalIdSignature(proto: ProtoFileLocalIdSignature): IdSignature {
if (useGlobalSignatures) {
val fp = if (proto.hasFile()) fileReader.deserializeString(proto.file) else fileSymbol.owner.path
return IdSignature.GlobalFileLocalSignature(deserializeIdSignature(proto.container), proto.localId, fp)
} else {
return IdSignature.FileLocalSignature(deserializeIdSignature(proto.container), proto.localId)
}
return IdSignature.FileLocalSignature(deserializeIdSignature(proto.container), proto.localId)
}
private fun deserializeScopeLocalIdSignature(proto: Int): IdSignature {
@@ -40,7 +40,6 @@ class IcFileDeserializer(
val originalEnqueue: IdSignature.(IcFileDeserializer) -> Unit,
val icFileData: SerializedIcDataForFile,
val mappingState: JsMappingState,
val publicSignatureToIcFileDeserializer: MutableMap<IdSignature, IcFileDeserializer>,
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
) {
@@ -149,7 +148,7 @@ class IcFileDeserializer(
icFileReader,
file.symbol,
emptyList(),
{ idSig -> enqueueLocalTopLevelDeclaration(idSig) },
{ idSig -> idSig.enqueue(this) },
{ _, s -> s },
enqueueAllDeclarations = true,
useGlobalSignatures = true,
@@ -194,12 +193,6 @@ class IcFileDeserializer(
}
}
fun init() {
reversedSignatureIndex.keys.forEach {
publicSignatureToIcFileDeserializer[it] = this
}
}
private val containerSigToOrder by lazy {
mutableMapOf<IdSignature, ByteArray>().also { map ->
val containerIds = IrLongArrayMemoryReader(icFileData.order.containerSignatures).array
@@ -236,12 +229,6 @@ class IcFileDeserializer(
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
}
private fun enqueueLocalTopLevelDeclaration(idSig: IdSignature) {
// We only care about declarations from IC cache. They all are in the map.
val deser = publicSignatureToIcFileDeserializer[idSig] ?: return
idSig.enqueue(deser)
}
fun deserializeDeclaration(idSig: IdSignature): IrDeclaration? {
cachedDeclaration(idSig)?.let { return it }
@@ -124,8 +124,6 @@ class IcModuleDeserializer(
it.file.path
}
private val publicSignatureToIcFileDeserializer = mutableMapOf<IdSignature, IcFileDeserializer>()
private fun deserializeIrFile(
fileProto: ProtoFile,
fileIndex: Int,
@@ -152,7 +150,6 @@ class IcModuleDeserializer(
{ fileDeserializer -> originalEnqueue(fileDeserializer) },
icFileData,
mapping.state,
publicSignatureToIcFileDeserializer,
{ fileDeserializer -> enqueue(fileDeserializer) },
)
@@ -167,14 +164,15 @@ class IcModuleDeserializer(
moduleReversedFileIndex.putIfAbsent(it, icDeserializer) // TODO Why not simple put?
}
icDeserializer.init()
icDeserializer.reversedSignatureIndex.keys.forEach {
if (it in icModuleReversedFileIndex) {
val existed = icModuleReversedFileIndex[it]!!
error("Duplicate signature $it in both ${existed.originalFileDeserializer.file.path} and in ${file.path}")
}
if (it.isPubliclyVisible) {
if (it in icModuleReversedFileIndex) {
val existed = icModuleReversedFileIndex[it]!!
error("Duplicate signature $it in both ${existed.originalFileDeserializer.file.path} and in ${file.path}")
}
icModuleReversedFileIndex[it] = icDeserializer
icModuleReversedFileIndex[it] = icDeserializer
}
}
if (strategy.theWholeWorld) {
@@ -163,10 +163,6 @@ class IdSignatureSerializerWithForIC(
localIndex = localIndexOffset
scopeIndex = scopeIndexOffset
}
override fun IrDeclaration.createFileLocalSignature(parentSignature: IdSignature, localIndex: Long, description: String?): IdSignature {
return IdSignature.GlobalFileLocalSignature(parentSignature, localIndex, fileOrNull?.path ?: "")
}
}
fun storeOrder(file: IrFile, fileDeclarations: Iterable<IrDeclaration>, idSigToLong: (IrSymbol) -> Long): SerializedOrder {