From 38ef5be2179333d0a1860d1eac5a225e445d6051 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Mon, 24 Jul 2023 17:30:30 +0200 Subject: [PATCH] [K/N] Don't store private signatures in symbol table Refactoring in 4986cb14 introduced an unintentional behavior change: private symbols are now findable in symbol table with lookup by signature. Unfortunately, this is not correct - private symbol signature might not be unique (or at least was sometimes not unique in older compiler versions), which leads to crashes on deserializing corresponding klib. This commit restores old behavior. ^KT-60616 --- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 21 +++++++++++-------- .../kotlin/ir/util/SymbolTableSlice.kt | 6 ++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index bb06b2d9686..fcd85ca1386 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -12,6 +12,9 @@ import org.jetbrains.kotlin.ir.declarations.lazy.IrLazySymbolTable import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.* +private fun > IdSignatureSymbolTableSlice(lock: IrLock) = + SymbolTableSlice.Flat(lock) { it.signature != null } + @OptIn(SymbolTableInternals::class) open class SymbolTable( val signaturer: IdSignatureComposer, @@ -20,15 +23,15 @@ open class SymbolTable( ) : ReferenceSymbolTable { val lock: IrLock = IrLock() - private val scriptSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val classSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val constructorSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val enumEntrySlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val fieldSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val functionSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val propertySlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val typeAliasSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) - private val globalTypeParameterSlice: SymbolTableSlice.Flat = SymbolTableSlice.Flat(lock) + private val scriptSlice = IdSignatureSymbolTableSlice(lock) + private val classSlice = IdSignatureSymbolTableSlice(lock) + private val constructorSlice = IdSignatureSymbolTableSlice(lock) + private val enumEntrySlice = IdSignatureSymbolTableSlice(lock) + private val fieldSlice = IdSignatureSymbolTableSlice(lock) + private val functionSlice = IdSignatureSymbolTableSlice(lock) + private val propertySlice = IdSignatureSymbolTableSlice(lock) + private val typeAliasSlice = IdSignatureSymbolTableSlice(lock) + private val globalTypeParameterSlice = IdSignatureSymbolTableSlice(lock) @Suppress("LeakingThis") val lazyWrapper = IrLazySymbolTable(this) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTableSlice.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTableSlice.kt index c33d1f33feb..1f026899cca 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTableSlice.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTableSlice.kt @@ -91,7 +91,7 @@ abstract class SymbolTableSlice(val lock: IrLock) return owner } - class Flat(lock: IrLock) : SymbolTableSlice(lock) + class Flat(lock: IrLock, val symbolFilter: (Symbol) -> Boolean = { true }) : SymbolTableSlice(lock) where SymbolOwner : IrSymbolOwner, Symbol : IrBindableSymbol<*, SymbolOwner> { private val signatureToSymbol = hashMapOf() @@ -100,7 +100,9 @@ abstract class SymbolTableSlice(val lock: IrLock) } override fun set(key: Key, symbol: Symbol) { - signatureToSymbol[key] = symbol + if (symbolFilter(symbol)) { + signatureToSymbol[key] = symbol + } } @SymbolTableInternals