[JS IC] Simplify code a bit more
This commit is contained in:
committed by
teamcityserver
parent
28cf9898ef
commit
aeea7147fe
+4
-5
@@ -125,7 +125,6 @@ open class IrFileSerializer(
|
|||||||
private val skipExpects: Boolean = false,
|
private val skipExpects: Boolean = false,
|
||||||
// required for JS IC caches
|
// required for JS IC caches
|
||||||
private val skipMutableState: Boolean = false,
|
private val skipMutableState: Boolean = false,
|
||||||
private val allowNullTypes: Boolean = false,
|
|
||||||
private val allowErrorStatementOrigins: Boolean = false, // TODO: support InlinerExpressionLocationHint
|
private val allowErrorStatementOrigins: Boolean = false, // TODO: support InlinerExpressionLocationHint
|
||||||
private val addDebugInfo: Boolean = true
|
private val addDebugInfo: Boolean = true
|
||||||
) {
|
) {
|
||||||
@@ -495,7 +494,7 @@ open class IrFileSerializer(
|
|||||||
type = (this as? IrTypeProjection)?.type?.toIrTypeKey
|
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.add(serializeIrTypeData(type))
|
||||||
protoTypeArray.size - 1
|
protoTypeArray.size - 1
|
||||||
}
|
}
|
||||||
@@ -594,9 +593,9 @@ open class IrFileSerializer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (index in 0 until call.typeArgumentsCount) {
|
for (index in 0 until call.typeArgumentsCount) {
|
||||||
val typeArgument = call.getTypeArgument(index)
|
// See `ForbidUsingExtensionPropertyTypeParameterInDelegate` language feature
|
||||||
if (typeArgument == null && !allowNullTypes) error("Expected type argument at $index in ${call.render()}")
|
val typeArgumentIndex = call.getTypeArgument(index)?.let { serializeIrType(it) } ?: -1
|
||||||
proto.addTypeArgument(serializeIrType(typeArgument))
|
proto.addTypeArgument(typeArgumentIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (index in 0 until call.valueArgumentsCount) {
|
for (index in 0 until call.valueArgumentsCount) {
|
||||||
|
|||||||
+24
-21
@@ -24,11 +24,12 @@ import org.jetbrains.kotlin.library.impl.DeclarationIrTableMemoryReader
|
|||||||
import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader
|
import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader
|
||||||
import org.jetbrains.kotlin.library.impl.IrLongArrayMemoryReader
|
import org.jetbrains.kotlin.library.impl.IrLongArrayMemoryReader
|
||||||
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
|
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
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFile as ProtoIrFile
|
||||||
|
|
||||||
class IcFileDeserializer(
|
class IcFileDeserializer(
|
||||||
val linker: JsIrLinker,
|
val linker: JsIrLinker,
|
||||||
file: IrFile,
|
private val file: IrFile,
|
||||||
originalFileReader: IrLibraryFile,
|
originalFileReader: IrLibraryFile,
|
||||||
fileProto: org.jetbrains.kotlin.backend.common.serialization.proto.IrFile,
|
fileProto: org.jetbrains.kotlin.backend.common.serialization.proto.IrFile,
|
||||||
deserializeBodies: Boolean,
|
deserializeBodies: Boolean,
|
||||||
@@ -42,6 +43,7 @@ class IcFileDeserializer(
|
|||||||
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
val enqueue: IdSignature.(IcFileDeserializer) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private val deserializedSymbols = mutableMapOf<IdSignature, IrSymbol>()
|
||||||
val originalSymbolDeserializer =
|
val originalSymbolDeserializer =
|
||||||
IrSymbolDeserializer(
|
IrSymbolDeserializer(
|
||||||
linker.symbolTable,
|
linker.symbolTable,
|
||||||
@@ -56,7 +58,8 @@ class IcFileDeserializer(
|
|||||||
},
|
},
|
||||||
linker::handleExpectActualMapping,
|
linker::handleExpectActualMapping,
|
||||||
enqueueAllDeclarations = true,
|
enqueueAllDeclarations = true,
|
||||||
deserializePublicSymbol = ::deserializeOriginalPublicSymbol,
|
deserializedSymbols = deserializedSymbols,
|
||||||
|
deserializePublicSymbol = ::deserializeOriginalPublicSymbol
|
||||||
)
|
)
|
||||||
|
|
||||||
private val originalDeclarationDeserializer = IrDeclarationDeserializer(
|
private val originalDeclarationDeserializer = IrDeclarationDeserializer(
|
||||||
@@ -71,7 +74,6 @@ class IcFileDeserializer(
|
|||||||
originalSymbolDeserializer,
|
originalSymbolDeserializer,
|
||||||
linker.fakeOverrideBuilder.platformSpecificClassFilter,
|
linker.fakeOverrideBuilder.platformSpecificClassFilter,
|
||||||
linker.fakeOverrideBuilder,
|
linker.fakeOverrideBuilder,
|
||||||
allowRedeclaration = true,
|
|
||||||
compatibilityMode = CompatibilityMode.CURRENT
|
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>()
|
val originalVisited = HashSet<IdSignature>()
|
||||||
|
|
||||||
@@ -149,7 +152,7 @@ class IcFileDeserializer(
|
|||||||
{ idSig -> idSig.enqueue(this) },
|
{ idSig -> idSig.enqueue(this) },
|
||||||
{ _, s -> s },
|
{ _, s -> s },
|
||||||
enqueueAllDeclarations = true,
|
enqueueAllDeclarations = true,
|
||||||
deserializedSymbols = originalFileDeserializer.symbolDeserializer.deserializedSymbols,
|
deserializedSymbols = deserializedSymbols,
|
||||||
::deserializePublicSymbol
|
::deserializePublicSymbol
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -173,11 +176,17 @@ class IcFileDeserializer(
|
|||||||
allowErrorLoopIndices = true,
|
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>()
|
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
|
// 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 topLevelSig = idSig.topLevelSignature()
|
||||||
val actualModuleDeserializer =
|
val actualModuleDeserializer =
|
||||||
moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig) ?:
|
moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig)
|
||||||
handleNoModuleDeserializerFound(
|
?: handleNoModuleDeserializerFound(idSig, moduleDeserializer.moduleDescriptor, moduleDeserializer.moduleDependencies)
|
||||||
idSig,
|
|
||||||
moduleDeserializer.moduleDescriptor,
|
|
||||||
moduleDeserializer.moduleDependencies
|
|
||||||
)
|
|
||||||
|
|
||||||
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
|
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
|
||||||
}
|
}
|
||||||
@@ -231,13 +236,13 @@ class IcFileDeserializer(
|
|||||||
|
|
||||||
val idSigIndex = reversedSignatureIndex[idSig] ?: return null
|
val idSigIndex = reversedSignatureIndex[idSig] ?: return null
|
||||||
val declarationStream = icFileReader.irDeclaration(idSigIndex).codedInputStream
|
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 declarationDeserializer.deserializeDeclaration(declarationProto)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return declaration iff it was already deserialized
|
// Return declaration iff it was already deserialized
|
||||||
private fun cachedDeclaration(idSig: IdSignature): IrDeclaration? {
|
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
|
if (symbol != null && symbol.isBound) return symbol.owner as? IrDeclaration
|
||||||
|
|
||||||
@@ -245,8 +250,6 @@ class IcFileDeserializer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun deserializeAnyDeclaration(idSig: IdSignature): IrDeclaration? {
|
fun deserializeAnyDeclaration(idSig: IdSignature): IrDeclaration? {
|
||||||
if (idSig is IdSignature.FileSignature) return null // TODO: is it needed
|
|
||||||
|
|
||||||
cachedDeclaration(idSig)?.let { return it }
|
cachedDeclaration(idSig)?.let { return it }
|
||||||
|
|
||||||
// TODO fast path?
|
// TODO fast path?
|
||||||
@@ -266,7 +269,7 @@ class IcFileDeserializer(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun deserializeIrSymbol(code: Long): IrSymbol {
|
private fun deserializeIrSymbol(code: Long): IrSymbol {
|
||||||
return symbolDeserializer.deserializeIrSymbol(code)
|
return symbolDeserializer.deserializeIrSymbol(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -95,8 +95,7 @@ class IcModuleDeserializer(
|
|||||||
override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol {
|
||||||
assert(idSig.isPubliclyVisible)
|
assert(idSig.isPubliclyVisible)
|
||||||
|
|
||||||
if (idSig in icModuleReversedFileIndex) {
|
icModuleReversedFileIndex[idSig]?.let { icDeserializer ->
|
||||||
val icDeserializer = icModuleReversedFileIndex[idSig]!!
|
|
||||||
return icDeserializer.deserializeIrSymbol(idSig, symbolKind)
|
return icDeserializer.deserializeIrSymbol(idSig, symbolKind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-5
@@ -85,7 +85,6 @@ class IcSerializer(
|
|||||||
mutableMapOf(),
|
mutableMapOf(),
|
||||||
skipExpects = true,
|
skipExpects = true,
|
||||||
icMode = true,
|
icMode = true,
|
||||||
allowNullTypes = true,
|
|
||||||
allowErrorStatementOrigins = true,
|
allowErrorStatementOrigins = true,
|
||||||
compatibilityMode = CompatibilityMode.CURRENT
|
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)
|
d is PersistentIrDeclarationBase<*> && (d.createdOn > 0 || /*d.isFakeOverride ||*/ (d is IrValueParameter || d is IrTypeParameter) && (d.parent as IrDeclaration).isFakeOverride)
|
||||||
}
|
}
|
||||||
|
|
||||||
val serializedCarriers = fileSerializer.serializeCarriers(
|
val serializedCarriers = fileSerializer.serializeCarriers(fileDeclarations, bodies) { declaration ->
|
||||||
fileDeclarations,
|
|
||||||
bodies,
|
|
||||||
) { declaration ->
|
|
||||||
icDeclarationTable.signatureByDeclaration(declaration, compatibleMode = false)
|
icDeclarationTable.signatureByDeclaration(declaration, compatibleMode = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-3
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
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.symbols.IrSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.IrMessageLogger
|
import org.jetbrains.kotlin.ir.util.IrMessageLogger
|
||||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||||
@@ -24,7 +23,6 @@ class JsIrFileSerializer(
|
|||||||
skipExpects: Boolean,
|
skipExpects: Boolean,
|
||||||
bodiesOnlyForInlines: Boolean = false,
|
bodiesOnlyForInlines: Boolean = false,
|
||||||
icMode: Boolean = false,
|
icMode: Boolean = false,
|
||||||
allowNullTypes: Boolean = false,
|
|
||||||
allowErrorStatementOrigins: Boolean = false,
|
allowErrorStatementOrigins: Boolean = false,
|
||||||
) : IrFileSerializer(
|
) : IrFileSerializer(
|
||||||
messageLogger,
|
messageLogger,
|
||||||
@@ -34,7 +32,6 @@ class JsIrFileSerializer(
|
|||||||
bodiesOnlyForInlines = bodiesOnlyForInlines,
|
bodiesOnlyForInlines = bodiesOnlyForInlines,
|
||||||
skipExpects = skipExpects,
|
skipExpects = skipExpects,
|
||||||
skipMutableState = icMode,
|
skipMutableState = icMode,
|
||||||
allowNullTypes = allowNullTypes,
|
|
||||||
allowErrorStatementOrigins = allowErrorStatementOrigins,
|
allowErrorStatementOrigins = allowErrorStatementOrigins,
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
Reference in New Issue
Block a user