[JS IC] Eradicate GlobalFileLocalSignature from code
- Reduce usage of global maps
This commit is contained in:
committed by
teamcityserver
parent
a0449892b2
commit
74d8e16d09
@@ -338,34 +338,6 @@ sealed class IdSignature {
|
|||||||
override fun hashCode(): Int = id
|
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
|
// Used to reference local variable and value parameters in function
|
||||||
class GlobalScopeLocalDeclaration(val id: Int, val description: String = "<no description>", val filePath: String) : IdSignature() {
|
class GlobalScopeLocalDeclaration(val id: Int, val description: String = "<no description>", val filePath: String) : IdSignature() {
|
||||||
override val isPubliclyVisible: Boolean get() = false
|
override val isPubliclyVisible: Boolean get() = false
|
||||||
|
|||||||
+13
-20
@@ -6,7 +6,10 @@
|
|||||||
package org.jetbrains.kotlin.backend.common.serialization
|
package org.jetbrains.kotlin.backend.common.serialization
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.encodings.*
|
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.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrFileEntry
|
import org.jetbrains.kotlin.ir.IrFileEntry
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.types.Variance
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.AccessorIdSignature as ProtoAccessorIdSignature
|
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.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.CompositeSignature as ProtoCompositeSignature
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FieldAccessCommon as ProtoFieldAccessCommon
|
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.FileEntry as ProtoFileEntry
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FileLocalIdSignature as ProtoFileLocalIdSignature
|
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.FileSignature as ProtoFileSignature
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
|
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.IrFunctionBase as ProtoFunctionBase
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFunctionExpression as ProtoFunctionExpression
|
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.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.IrGetClass as ProtoGetClass
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetEnumValue as ProtoGetEnumValue
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetEnumValue as ProtoGetEnumValue
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrGetField as ProtoGetField
|
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.IrOperation as ProtoOperation
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrProperty as ProtoProperty
|
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.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.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.IrReturnableBlockReturn as ProtoReturnableBlockReturn
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSetField as ProtoSetField
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSetField as ProtoSetField
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSetValue as ProtoSetValue
|
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.IrWhile as ProtoWhile
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature
|
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.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.MemberAccessCommon as ProtoMemberAccessCommon
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.NullableIrExpression as ProtoNullableIrExpression
|
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.ScopeLocalIdSignature as ProtoScopeLocalIdSignature
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature
|
|
||||||
|
|
||||||
open class IrFileSerializer(
|
open class IrFileSerializer(
|
||||||
val messageLogger: IrMessageLogger,
|
val messageLogger: IrMessageLogger,
|
||||||
@@ -274,16 +277,6 @@ open class IrFileSerializer(
|
|||||||
return proto.build()
|
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 {
|
private fun serializeScopeLocalSignature(signature: IdSignature.GlobalScopeLocalDeclaration): ProtoScopeLocalIdSignature {
|
||||||
val proto = ProtoScopeLocalIdSignature.newBuilder()
|
val proto = ProtoScopeLocalIdSignature.newBuilder()
|
||||||
|
|
||||||
@@ -315,7 +308,6 @@ open class IrFileSerializer(
|
|||||||
is IdSignature.FileSignature -> proto.fileSig = serializeFileSignature(idSignature)
|
is IdSignature.FileSignature -> proto.fileSig = serializeFileSignature(idSignature)
|
||||||
// IR IC part
|
// IR IC part
|
||||||
is IdSignature.LoweredDeclarationSignature -> proto.icSig = serializeLoweredDeclarationSignature(idSignature)
|
is IdSignature.LoweredDeclarationSignature -> proto.icSig = serializeLoweredDeclarationSignature(idSignature)
|
||||||
is IdSignature.GlobalFileLocalSignature -> proto.privateSig = serializePrivateSignature(idSignature)
|
|
||||||
is IdSignature.GlobalScopeLocalDeclaration -> proto.externalScopedLocalSig = serializeScopeLocalSignature(idSignature)
|
is IdSignature.GlobalScopeLocalDeclaration -> proto.externalScopedLocalSig = serializeScopeLocalSignature(idSignature)
|
||||||
is IdSignature.SpecialFakeOverrideSignature -> {}
|
is IdSignature.SpecialFakeOverrideSignature -> {}
|
||||||
}
|
}
|
||||||
@@ -558,9 +550,10 @@ open class IrFileSerializer(
|
|||||||
proto.addStatement(serializeStatement(it))
|
proto.addStatement(serializeStatement(it))
|
||||||
}
|
}
|
||||||
|
|
||||||
returnableBlock.inlineFunctionSymbol?.let {
|
// TODO: decided how should file reference be stored in IC cache
|
||||||
proto.inlineFunctionSymbol = serializeIrSymbol(it)
|
// returnableBlock.inlineFunctionSymbol?.let {
|
||||||
}
|
// proto.inlineFunctionSymbol = serializeIrSymbol(it)
|
||||||
|
// }
|
||||||
|
|
||||||
proto.build()
|
proto.build()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-6
@@ -160,12 +160,7 @@ class IrSymbolDeserializer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun deserializeFileLocalIdSignature(proto: ProtoFileLocalIdSignature): IdSignature {
|
private fun deserializeFileLocalIdSignature(proto: ProtoFileLocalIdSignature): IdSignature {
|
||||||
if (useGlobalSignatures) {
|
return IdSignature.FileLocalSignature(deserializeIdSignature(proto.container), proto.localId)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun deserializeScopeLocalIdSignature(proto: Int): IdSignature {
|
private fun deserializeScopeLocalIdSignature(proto: Int): IdSignature {
|
||||||
|
|||||||
+1
-14
@@ -40,7 +40,6 @@ class IcFileDeserializer(
|
|||||||
val originalEnqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
val originalEnqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
||||||
val icFileData: SerializedIcDataForFile,
|
val icFileData: SerializedIcDataForFile,
|
||||||
val mappingState: JsMappingState,
|
val mappingState: JsMappingState,
|
||||||
val publicSignatureToIcFileDeserializer: MutableMap<IdSignature, IcFileDeserializer>,
|
|
||||||
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@@ -149,7 +148,7 @@ class IcFileDeserializer(
|
|||||||
icFileReader,
|
icFileReader,
|
||||||
file.symbol,
|
file.symbol,
|
||||||
emptyList(),
|
emptyList(),
|
||||||
{ idSig -> enqueueLocalTopLevelDeclaration(idSig) },
|
{ idSig -> idSig.enqueue(this) },
|
||||||
{ _, s -> s },
|
{ _, s -> s },
|
||||||
enqueueAllDeclarations = true,
|
enqueueAllDeclarations = true,
|
||||||
useGlobalSignatures = true,
|
useGlobalSignatures = true,
|
||||||
@@ -194,12 +193,6 @@ class IcFileDeserializer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun init() {
|
|
||||||
reversedSignatureIndex.keys.forEach {
|
|
||||||
publicSignatureToIcFileDeserializer[it] = this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val containerSigToOrder by lazy {
|
private val containerSigToOrder by lazy {
|
||||||
mutableMapOf<IdSignature, ByteArray>().also { map ->
|
mutableMapOf<IdSignature, ByteArray>().also { map ->
|
||||||
val containerIds = IrLongArrayMemoryReader(icFileData.order.containerSignatures).array
|
val containerIds = IrLongArrayMemoryReader(icFileData.order.containerSignatures).array
|
||||||
@@ -236,12 +229,6 @@ class IcFileDeserializer(
|
|||||||
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
|
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? {
|
fun deserializeDeclaration(idSig: IdSignature): IrDeclaration? {
|
||||||
cachedDeclaration(idSig)?.let { return it }
|
cachedDeclaration(idSig)?.let { return it }
|
||||||
|
|
||||||
|
|||||||
+7
-9
@@ -124,8 +124,6 @@ class IcModuleDeserializer(
|
|||||||
it.file.path
|
it.file.path
|
||||||
}
|
}
|
||||||
|
|
||||||
private val publicSignatureToIcFileDeserializer = mutableMapOf<IdSignature, IcFileDeserializer>()
|
|
||||||
|
|
||||||
private fun deserializeIrFile(
|
private fun deserializeIrFile(
|
||||||
fileProto: ProtoFile,
|
fileProto: ProtoFile,
|
||||||
fileIndex: Int,
|
fileIndex: Int,
|
||||||
@@ -152,7 +150,6 @@ class IcModuleDeserializer(
|
|||||||
{ fileDeserializer -> originalEnqueue(fileDeserializer) },
|
{ fileDeserializer -> originalEnqueue(fileDeserializer) },
|
||||||
icFileData,
|
icFileData,
|
||||||
mapping.state,
|
mapping.state,
|
||||||
publicSignatureToIcFileDeserializer,
|
|
||||||
{ fileDeserializer -> enqueue(fileDeserializer) },
|
{ fileDeserializer -> enqueue(fileDeserializer) },
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -167,14 +164,15 @@ class IcModuleDeserializer(
|
|||||||
moduleReversedFileIndex.putIfAbsent(it, icDeserializer) // TODO Why not simple put?
|
moduleReversedFileIndex.putIfAbsent(it, icDeserializer) // TODO Why not simple put?
|
||||||
}
|
}
|
||||||
|
|
||||||
icDeserializer.init()
|
|
||||||
icDeserializer.reversedSignatureIndex.keys.forEach {
|
icDeserializer.reversedSignatureIndex.keys.forEach {
|
||||||
if (it in icModuleReversedFileIndex) {
|
if (it.isPubliclyVisible) {
|
||||||
val existed = icModuleReversedFileIndex[it]!!
|
if (it in icModuleReversedFileIndex) {
|
||||||
error("Duplicate signature $it in both ${existed.originalFileDeserializer.file.path} and in ${file.path}")
|
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) {
|
if (strategy.theWholeWorld) {
|
||||||
|
|||||||
@@ -163,10 +163,6 @@ class IdSignatureSerializerWithForIC(
|
|||||||
localIndex = localIndexOffset
|
localIndex = localIndexOffset
|
||||||
scopeIndex = scopeIndexOffset
|
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 {
|
fun storeOrder(file: IrFile, fileDeclarations: Iterable<IrDeclaration>, idSigToLong: (IrSymbol) -> Long): SerializedOrder {
|
||||||
|
|||||||
Reference in New Issue
Block a user