[JS IC] Simplify code a bit more

This commit is contained in:
Roman Artemev
2021-07-29 13:30:07 +03:00
committed by teamcityserver
parent 28cf9898ef
commit aeea7147fe
5 changed files with 30 additions and 36 deletions
@@ -125,7 +125,6 @@ open class IrFileSerializer(
private val skipExpects: Boolean = false,
// required for JS IC caches
private val skipMutableState: Boolean = false,
private val allowNullTypes: Boolean = false,
private val allowErrorStatementOrigins: Boolean = false, // TODO: support InlinerExpressionLocationHint
private val addDebugInfo: Boolean = true
) {
@@ -495,7 +494,7 @@ open class IrFileSerializer(
type = (this as? IrTypeProjection)?.type?.toIrTypeKey
)
fun serializeIrType(type: IrType?) = if (type == null) -1 else protoTypeMap.getOrPut(type.toIrTypeKey) {
fun serializeIrType(type: IrType) = protoTypeMap.getOrPut(type.toIrTypeKey) {
protoTypeArray.add(serializeIrTypeData(type))
protoTypeArray.size - 1
}
@@ -594,9 +593,9 @@ open class IrFileSerializer(
}
for (index in 0 until call.typeArgumentsCount) {
val typeArgument = call.getTypeArgument(index)
if (typeArgument == null && !allowNullTypes) error("Expected type argument at $index in ${call.render()}")
proto.addTypeArgument(serializeIrType(typeArgument))
// See `ForbidUsingExtensionPropertyTypeParameterInDelegate` language feature
val typeArgumentIndex = call.getTypeArgument(index)?.let { serializeIrType(it) } ?: -1
proto.addTypeArgument(typeArgumentIndex)
}
for (index in 0 until call.valueArgumentsCount) {
@@ -24,11 +24,12 @@ import org.jetbrains.kotlin.library.impl.DeclarationIrTableMemoryReader
import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader
import org.jetbrains.kotlin.library.impl.IrLongArrayMemoryReader
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
import org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration as ProtoIrDeclaration
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFile as ProtoIrFile
class IcFileDeserializer(
val linker: JsIrLinker,
file: IrFile,
private val file: IrFile,
originalFileReader: IrLibraryFile,
fileProto: org.jetbrains.kotlin.backend.common.serialization.proto.IrFile,
deserializeBodies: Boolean,
@@ -42,6 +43,7 @@ class IcFileDeserializer(
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
) {
private val deserializedSymbols = mutableMapOf<IdSignature, IrSymbol>()
val originalSymbolDeserializer =
IrSymbolDeserializer(
linker.symbolTable,
@@ -56,7 +58,8 @@ class IcFileDeserializer(
},
linker::handleExpectActualMapping,
enqueueAllDeclarations = true,
deserializePublicSymbol = ::deserializeOriginalPublicSymbol,
deserializedSymbols = deserializedSymbols,
deserializePublicSymbol = ::deserializeOriginalPublicSymbol
)
private val originalDeclarationDeserializer = IrDeclarationDeserializer(
@@ -71,7 +74,6 @@ class IcFileDeserializer(
originalSymbolDeserializer,
linker.fakeOverrideBuilder.platformSpecificClassFilter,
linker.fakeOverrideBuilder,
allowRedeclaration = true,
compatibilityMode = CompatibilityMode.CURRENT
)
@@ -105,7 +107,8 @@ class IcFileDeserializer(
}
}
val originalFileDeserializer = IrFileDeserializer(file, originalFileReader, fileProto, originalSymbolDeserializer, originalDeclarationDeserializer)
val originalFileDeserializer =
IrFileDeserializer(file, originalFileReader, fileProto, originalSymbolDeserializer, originalDeclarationDeserializer)
val originalVisited = HashSet<IdSignature>()
@@ -149,7 +152,7 @@ class IcFileDeserializer(
{ idSig -> idSig.enqueue(this) },
{ _, s -> s },
enqueueAllDeclarations = true,
deserializedSymbols = originalFileDeserializer.symbolDeserializer.deserializedSymbols,
deserializedSymbols = deserializedSymbols,
::deserializePublicSymbol
)
@@ -173,11 +176,17 @@ class IcFileDeserializer(
allowErrorLoopIndices = true,
)
private val protoFile: ProtoIrFile by lazy { ProtoIrFile.parseFrom(icFileData.file.fileData.codedInputStream, ExtensionRegistryLite.newInstance()) }
private val protoFile: ProtoIrFile by lazy {
ProtoIrFile.parseFrom(icFileData.file.fileData.codedInputStream, ExtensionRegistryLite.newInstance())
}
private val carrierDeserializer by lazy { CarrierDeserializer(declarationDeserializer, icFileData.carriers) }
private val carrierDeserializer by lazy {
CarrierDeserializer(declarationDeserializer, icFileData.carriers)
}
val reversedSignatureIndex: Map<IdSignature, Int> = protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap()
val reversedSignatureIndex: Map<IdSignature, Int> = protoFile.declarationIdList.map {
symbolDeserializer.deserializeIdSignature(it) to it
}.toMap()
val visited = HashSet<IdSignature>()
@@ -211,17 +220,13 @@ class IcFileDeserializer(
}
private fun deserializePublicSymbol(idSig: IdSignature, kind: BinarySymbolData.SymbolKind) : IrSymbol {
private fun deserializePublicSymbol(idSig: IdSignature, kind: BinarySymbolData.SymbolKind): IrSymbol {
// TODO: reference lowered declarations cross-module
if (kind == BinarySymbolData.SymbolKind.FILE_SYMBOL) return (idSig as IdSignature.FileSignature).fileSymbol
if (kind == BinarySymbolData.SymbolKind.FILE_SYMBOL) return file.symbol
val topLevelSig = idSig.topLevelSignature()
val actualModuleDeserializer =
moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig) ?:
handleNoModuleDeserializerFound(
idSig,
moduleDeserializer.moduleDescriptor,
moduleDeserializer.moduleDependencies
)
moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig)
?: handleNoModuleDeserializerFound(idSig, moduleDeserializer.moduleDescriptor, moduleDeserializer.moduleDependencies)
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
}
@@ -231,13 +236,13 @@ class IcFileDeserializer(
val idSigIndex = reversedSignatureIndex[idSig] ?: return null
val declarationStream = icFileReader.irDeclaration(idSigIndex).codedInputStream
val declarationProto = org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration.parseFrom(declarationStream, ExtensionRegistryLite.newInstance())
val declarationProto = ProtoIrDeclaration.parseFrom(declarationStream, ExtensionRegistryLite.newInstance())
return declarationDeserializer.deserializeDeclaration(declarationProto)
}
// Return declaration iff it was already deserialized
private fun cachedDeclaration(idSig: IdSignature): IrDeclaration? {
val symbol = symbolDeserializer.deserializedSymbols[idSig] // Same map is used for both symbol deserializers
val symbol = deserializedSymbols[idSig] // Same map is used for both symbol deserializers
if (symbol != null && symbol.isBound) return symbol.owner as? IrDeclaration
@@ -245,8 +250,6 @@ class IcFileDeserializer(
}
fun deserializeAnyDeclaration(idSig: IdSignature): IrDeclaration? {
if (idSig is IdSignature.FileSignature) return null // TODO: is it needed
cachedDeclaration(idSig)?.let { return it }
// TODO fast path?
@@ -266,7 +269,7 @@ class IcFileDeserializer(
return null
}
fun deserializeIrSymbol(code: Long): IrSymbol {
private fun deserializeIrSymbol(code: Long): IrSymbol {
return symbolDeserializer.deserializeIrSymbol(code)
}
@@ -95,8 +95,7 @@ class IcModuleDeserializer(
override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
assert(idSig.isPubliclyVisible)
if (idSig in icModuleReversedFileIndex) {
val icDeserializer = icModuleReversedFileIndex[idSig]!!
icModuleReversedFileIndex[idSig]?.let { icDeserializer ->
return icDeserializer.deserializeIrSymbol(idSig, symbolKind)
}
@@ -85,7 +85,6 @@ class IcSerializer(
mutableMapOf(),
skipExpects = true,
icMode = true,
allowNullTypes = true,
allowErrorStatementOrigins = true,
compatibilityMode = CompatibilityMode.CURRENT
)
@@ -104,10 +103,7 @@ class IcSerializer(
d is PersistentIrDeclarationBase<*> && (d.createdOn > 0 || /*d.isFakeOverride ||*/ (d is IrValueParameter || d is IrTypeParameter) && (d.parent as IrDeclaration).isFakeOverride)
}
val serializedCarriers = fileSerializer.serializeCarriers(
fileDeclarations,
bodies,
) { declaration ->
val serializedCarriers = fileSerializer.serializeCarriers(fileDeclarations, bodies) { declaration ->
icDeclarationTable.signatureByDeclaration(declaration, compatibleMode = false)
}
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.ir.util.hasAnnotation
@@ -24,7 +23,6 @@ class JsIrFileSerializer(
skipExpects: Boolean,
bodiesOnlyForInlines: Boolean = false,
icMode: Boolean = false,
allowNullTypes: Boolean = false,
allowErrorStatementOrigins: Boolean = false,
) : IrFileSerializer(
messageLogger,
@@ -34,7 +32,6 @@ class JsIrFileSerializer(
bodiesOnlyForInlines = bodiesOnlyForInlines,
skipExpects = skipExpects,
skipMutableState = icMode,
allowNullTypes = allowNullTypes,
allowErrorStatementOrigins = allowErrorStatementOrigins,
) {
companion object {