[IR] Drastically simplify the hierarchy of IR origins
IrStatementOriginImpl and IrDeclarationOriginImpl were made final classes to simplify the creation of them (a delegate provider was added) and to optimize performance when comparing the origins by type and name
This commit is contained in:
committed by
Space Team
parent
f2ddae533e
commit
a3b55cf758
+1
-1
@@ -100,7 +100,7 @@ internal class PartialLinkageSupportForLoweringsImpl(
|
||||
startOffset
|
||||
}
|
||||
|
||||
else -> if (origin is PartiallyLinkedDeclarationOrigin) {
|
||||
else -> if (origin in PartiallyLinkedDeclarationOrigin.entries) {
|
||||
// There is no sense to take coordinates from the declaration that does not exist in the code.
|
||||
// Let's take the coordinates of the parent.
|
||||
parent.startOffsetOfFirstDenotableIrElement()
|
||||
|
||||
+2
-2
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.PARTIAL_LINKAGE_RUNTIME_ERROR
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.Companion.PARTIAL_LINKAGE_RUNTIME_ERROR
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
||||
import org.jetbrains.kotlin.ir.linkage.partial.*
|
||||
import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageCase.*
|
||||
@@ -457,7 +457,7 @@ internal class PartiallyLinkedIrTreePatcher(
|
||||
|
||||
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
|
||||
// Optimization: Don't patch expressions under generated synthetic declarations.
|
||||
return if (declaration.origin is PartiallyLinkedDeclarationOrigin)
|
||||
return if (declaration.origin in PartiallyLinkedDeclarationOrigin.entries)
|
||||
declaration // There are neither expressions nor annotations to patch.
|
||||
else {
|
||||
declaration.filterUnusableAnnotations()
|
||||
|
||||
+6
-6
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.types.impl.*
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
import org.jetbrains.kotlin.utils.memoryOptimizedMap
|
||||
import kotlin.reflect.full.declaredMemberProperties
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlock as ProtoBlock
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlockBody as ProtoBlockBody
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBranch as ProtoBranch
|
||||
@@ -857,11 +858,10 @@ class IrBodyDeserializer(
|
||||
code: () -> Long
|
||||
): S? = if (condition) deserializeTypedSymbol(code(), fallbackSymbolKind, remap = true) else null
|
||||
|
||||
companion object {
|
||||
|
||||
private val allKnownStatementOrigins = IrStatementOrigin::class.nestedClasses.toList()
|
||||
|
||||
private val statementOriginIndex =
|
||||
allKnownStatementOrigins.mapNotNull { it.objectInstance as? IrStatementOriginImpl }.associateBy { it.debugName }
|
||||
private companion object {
|
||||
private val statementOriginIndex = IrStatementOrigin.Companion::class
|
||||
.declaredMemberProperties
|
||||
.mapNotNull { it.get(IrStatementOrigin.Companion) as? IrStatementOrigin }
|
||||
.associateBy { it.debugName }
|
||||
}
|
||||
}
|
||||
|
||||
+14
-9
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.utils.*
|
||||
import kotlin.collections.set
|
||||
import kotlin.reflect.full.declaredMemberProperties
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrClass as ProtoClass
|
||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructor as ProtoConstructor
|
||||
@@ -252,7 +253,7 @@ class IrDeclarationDeserializer(
|
||||
private inline fun <T> withDeserializedIrDeclarationBase(
|
||||
proto: ProtoDeclarationBase,
|
||||
setParent: Boolean = true,
|
||||
block: (IrSymbol, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T
|
||||
block: (IrSymbol, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T,
|
||||
): T where T : IrDeclaration, T : IrSymbolOwner {
|
||||
val (s, uid) = symbolDeserializer.deserializeIrSymbolToDeclare(proto.symbol)
|
||||
val coordinates = BinaryCoordinates.decode(proto.coordinates)
|
||||
@@ -556,7 +557,7 @@ class IrDeclarationDeserializer(
|
||||
proto: ProtoFunctionBase,
|
||||
setParent: Boolean = true,
|
||||
fallbackSymbolKind: SymbolKind,
|
||||
block: (S, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T
|
||||
block: (S, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T,
|
||||
): T = withDeserializedIrDeclarationBase(proto.base, setParent) { symbol, idSig, startOffset, endOffset, origin, fcode ->
|
||||
val functionSymbol: S = symbol.checkSymbolType(fallbackSymbolKind)
|
||||
symbolTable.withScope(functionSymbol) {
|
||||
@@ -621,7 +622,8 @@ class IrDeclarationDeserializer(
|
||||
isFakeOverride = flags.isFakeOverride,
|
||||
)
|
||||
}.apply {
|
||||
overriddenSymbols = proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) }
|
||||
overriddenSymbols =
|
||||
proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -726,7 +728,7 @@ class IrDeclarationDeserializer(
|
||||
|
||||
private fun deserializeIrLocalDelegatedProperty(
|
||||
proto: ProtoLocalDelegatedProperty,
|
||||
setParent: Boolean = true
|
||||
setParent: Boolean = true,
|
||||
): IrLocalDelegatedProperty =
|
||||
withDeserializedIrDeclarationBase(proto.base, setParent) { symbol, _, startOffset, endOffset, origin, fcode ->
|
||||
val flags = LocalVariableFlags.decode(fcode)
|
||||
@@ -794,17 +796,20 @@ class IrDeclarationDeserializer(
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val allKnownDeclarationOrigins = IrDeclarationOrigin::class.nestedClasses.toList()
|
||||
private val declarationOriginIndex =
|
||||
allKnownDeclarationOrigins.mapNotNull { it.objectInstance as? IrDeclarationOriginImpl }.associateBy { it.name }
|
||||
private companion object {
|
||||
private val declarationOriginIndex by lazy {
|
||||
IrDeclarationOrigin.Companion::class
|
||||
.declaredMemberProperties
|
||||
.mapNotNull { it.get(IrDeclarationOrigin.Companion) as? IrDeclarationOriginImpl }
|
||||
.associateBy { it.name }
|
||||
}
|
||||
}
|
||||
|
||||
private fun deserializeIrDeclarationOrigin(protoName: Int): IrDeclarationOrigin {
|
||||
val originName = libraryFile.string(protoName)
|
||||
return IrDeclarationOrigin.GeneratedByPlugin.fromSerializedString(originName)
|
||||
?: declarationOriginIndex[originName]
|
||||
?: object : IrDeclarationOriginImpl(originName) {}
|
||||
?: IrDeclarationOriginImpl(originName)
|
||||
}
|
||||
|
||||
fun deserializeDeclaration(proto: ProtoDeclaration, setParent: Boolean = true): IrDeclaration {
|
||||
|
||||
+1
-1
@@ -92,7 +92,7 @@ class FileDeserializationState(
|
||||
linker.fakeOverrideBuilder,
|
||||
compatibilityMode = moduleDeserializer.compatibilityMode,
|
||||
linker.partialLinkageSupport.isEnabled,
|
||||
internationService = linker.internationService
|
||||
internationService = linker.internationService,
|
||||
)
|
||||
|
||||
val fileDeserializer = IrFileDeserializer(file, fileReader, fileProto, symbolDeserializer, declarationDeserializer)
|
||||
|
||||
+1
-1
@@ -183,7 +183,7 @@ open class IrFileSerializer(
|
||||
private fun serializeIrDeclarationOrigin(origin: IrDeclarationOrigin): Int = serializeString(origin.name)
|
||||
|
||||
private fun serializeIrStatementOrigin(origin: IrStatementOrigin): Int =
|
||||
serializeString((origin as? IrStatementOriginImpl)?.debugName ?: error("Unable to serialize origin ${origin.javaClass.name}"))
|
||||
serializeString(origin.debugName)
|
||||
|
||||
private fun serializeCoordinates(start: Int, end: Int): Long = if (skipPrivateApi) {
|
||||
0L
|
||||
|
||||
Reference in New Issue
Block a user