[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
This commit is contained in:
Pavel Kunyavskiy
2023-07-24 17:30:30 +02:00
committed by Space Team
parent cc27bfd39a
commit 38ef5be217
2 changed files with 16 additions and 11 deletions
@@ -12,6 +12,9 @@ import org.jetbrains.kotlin.ir.declarations.lazy.IrLazySymbolTable
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.* import org.jetbrains.kotlin.ir.symbols.impl.*
private fun <SymbolOwner : IrSymbolOwner, Symbol : IrBindableSymbol<*, SymbolOwner>> IdSignatureSymbolTableSlice(lock: IrLock) =
SymbolTableSlice.Flat<IdSignature, SymbolOwner, Symbol>(lock) { it.signature != null }
@OptIn(SymbolTableInternals::class) @OptIn(SymbolTableInternals::class)
open class SymbolTable( open class SymbolTable(
val signaturer: IdSignatureComposer, val signaturer: IdSignatureComposer,
@@ -20,15 +23,15 @@ open class SymbolTable(
) : ReferenceSymbolTable { ) : ReferenceSymbolTable {
val lock: IrLock = IrLock() val lock: IrLock = IrLock()
private val scriptSlice: SymbolTableSlice.Flat<IdSignature, IrScript, IrScriptSymbol> = SymbolTableSlice.Flat(lock) private val scriptSlice = IdSignatureSymbolTableSlice<IrScript, IrScriptSymbol>(lock)
private val classSlice: SymbolTableSlice.Flat<IdSignature, IrClass, IrClassSymbol> = SymbolTableSlice.Flat(lock) private val classSlice = IdSignatureSymbolTableSlice<IrClass, IrClassSymbol>(lock)
private val constructorSlice: SymbolTableSlice.Flat<IdSignature, IrConstructor, IrConstructorSymbol> = SymbolTableSlice.Flat(lock) private val constructorSlice = IdSignatureSymbolTableSlice<IrConstructor, IrConstructorSymbol>(lock)
private val enumEntrySlice: SymbolTableSlice.Flat<IdSignature, IrEnumEntry, IrEnumEntrySymbol> = SymbolTableSlice.Flat(lock) private val enumEntrySlice = IdSignatureSymbolTableSlice<IrEnumEntry, IrEnumEntrySymbol>(lock)
private val fieldSlice: SymbolTableSlice.Flat<IdSignature, IrField, IrFieldSymbol> = SymbolTableSlice.Flat(lock) private val fieldSlice = IdSignatureSymbolTableSlice<IrField, IrFieldSymbol>(lock)
private val functionSlice: SymbolTableSlice.Flat<IdSignature, IrSimpleFunction, IrSimpleFunctionSymbol> = SymbolTableSlice.Flat(lock) private val functionSlice = IdSignatureSymbolTableSlice<IrSimpleFunction, IrSimpleFunctionSymbol>(lock)
private val propertySlice: SymbolTableSlice.Flat<IdSignature, IrProperty, IrPropertySymbol> = SymbolTableSlice.Flat(lock) private val propertySlice = IdSignatureSymbolTableSlice<IrProperty, IrPropertySymbol>(lock)
private val typeAliasSlice: SymbolTableSlice.Flat<IdSignature, IrTypeAlias, IrTypeAliasSymbol> = SymbolTableSlice.Flat(lock) private val typeAliasSlice = IdSignatureSymbolTableSlice<IrTypeAlias, IrTypeAliasSymbol>(lock)
private val globalTypeParameterSlice: SymbolTableSlice.Flat<IdSignature, IrTypeParameter, IrTypeParameterSymbol> = SymbolTableSlice.Flat(lock) private val globalTypeParameterSlice = IdSignatureSymbolTableSlice<IrTypeParameter, IrTypeParameterSymbol>(lock)
@Suppress("LeakingThis") @Suppress("LeakingThis")
val lazyWrapper = IrLazySymbolTable(this) val lazyWrapper = IrLazySymbolTable(this)
@@ -91,7 +91,7 @@ abstract class SymbolTableSlice<Key, SymbolOwner, Symbol>(val lock: IrLock)
return owner return owner
} }
class Flat<Key, SymbolOwner, Symbol>(lock: IrLock) : SymbolTableSlice<Key, SymbolOwner, Symbol>(lock) class Flat<Key, SymbolOwner, Symbol>(lock: IrLock, val symbolFilter: (Symbol) -> Boolean = { true }) : SymbolTableSlice<Key, SymbolOwner, Symbol>(lock)
where SymbolOwner : IrSymbolOwner, Symbol : IrBindableSymbol<*, SymbolOwner> { where SymbolOwner : IrSymbolOwner, Symbol : IrBindableSymbol<*, SymbolOwner> {
private val signatureToSymbol = hashMapOf<Key, Symbol>() private val signatureToSymbol = hashMapOf<Key, Symbol>()
@@ -100,7 +100,9 @@ abstract class SymbolTableSlice<Key, SymbolOwner, Symbol>(val lock: IrLock)
} }
override fun set(key: Key, symbol: Symbol) { override fun set(key: Key, symbol: Symbol) {
signatureToSymbol[key] = symbol if (symbolFilter(symbol)) {
signatureToSymbol[key] = symbol
}
} }
@SymbolTableInternals @SymbolTableInternals