[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.impl.*
private fun <SymbolOwner : IrSymbolOwner, Symbol : IrBindableSymbol<*, SymbolOwner>> IdSignatureSymbolTableSlice(lock: IrLock) =
SymbolTableSlice.Flat<IdSignature, SymbolOwner, Symbol>(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<IdSignature, IrScript, IrScriptSymbol> = SymbolTableSlice.Flat(lock)
private val classSlice: SymbolTableSlice.Flat<IdSignature, IrClass, IrClassSymbol> = SymbolTableSlice.Flat(lock)
private val constructorSlice: SymbolTableSlice.Flat<IdSignature, IrConstructor, IrConstructorSymbol> = SymbolTableSlice.Flat(lock)
private val enumEntrySlice: SymbolTableSlice.Flat<IdSignature, IrEnumEntry, IrEnumEntrySymbol> = SymbolTableSlice.Flat(lock)
private val fieldSlice: SymbolTableSlice.Flat<IdSignature, IrField, IrFieldSymbol> = SymbolTableSlice.Flat(lock)
private val functionSlice: SymbolTableSlice.Flat<IdSignature, IrSimpleFunction, IrSimpleFunctionSymbol> = SymbolTableSlice.Flat(lock)
private val propertySlice: SymbolTableSlice.Flat<IdSignature, IrProperty, IrPropertySymbol> = SymbolTableSlice.Flat(lock)
private val typeAliasSlice: SymbolTableSlice.Flat<IdSignature, IrTypeAlias, IrTypeAliasSymbol> = SymbolTableSlice.Flat(lock)
private val globalTypeParameterSlice: SymbolTableSlice.Flat<IdSignature, IrTypeParameter, IrTypeParameterSymbol> = SymbolTableSlice.Flat(lock)
private val scriptSlice = IdSignatureSymbolTableSlice<IrScript, IrScriptSymbol>(lock)
private val classSlice = IdSignatureSymbolTableSlice<IrClass, IrClassSymbol>(lock)
private val constructorSlice = IdSignatureSymbolTableSlice<IrConstructor, IrConstructorSymbol>(lock)
private val enumEntrySlice = IdSignatureSymbolTableSlice<IrEnumEntry, IrEnumEntrySymbol>(lock)
private val fieldSlice = IdSignatureSymbolTableSlice<IrField, IrFieldSymbol>(lock)
private val functionSlice = IdSignatureSymbolTableSlice<IrSimpleFunction, IrSimpleFunctionSymbol>(lock)
private val propertySlice = IdSignatureSymbolTableSlice<IrProperty, IrPropertySymbol>(lock)
private val typeAliasSlice = IdSignatureSymbolTableSlice<IrTypeAlias, IrTypeAliasSymbol>(lock)
private val globalTypeParameterSlice = IdSignatureSymbolTableSlice<IrTypeParameter, IrTypeParameterSymbol>(lock)
@Suppress("LeakingThis")
val lazyWrapper = IrLazySymbolTable(this)
@@ -91,7 +91,7 @@ abstract class SymbolTableSlice<Key, SymbolOwner, Symbol>(val lock: IrLock)
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> {
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) {
signatureToSymbol[key] = symbol
if (symbolFilter(symbol)) {
signatureToSymbol[key] = symbol
}
}
@SymbolTableInternals