[IR SERIALIZATION] Handle UniqId clashes

This commit is contained in:
Roman Artemev
2019-08-12 15:03:45 +03:00
committed by romanart
parent 5e14b94a88
commit f6339bcf93
2 changed files with 36 additions and 8 deletions
@@ -20,10 +20,21 @@ class DescriptorTable {
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
}
// TODO: We don't manage id clashes anyhow now.
abstract class GlobalDeclarationTable(private val mangler: KotlinMangler) {
interface UniqIdClashTracker {
fun commit(declaration: IrDeclaration, uniqId: UniqId)
companion object {
val DEFAULT_TRACKER = object : UniqIdClashTracker {
override fun commit(declaration: IrDeclaration, uniqId: UniqId) {}
}
}
}
abstract class GlobalDeclarationTable(private val mangler: KotlinMangler, private val clashTracker: UniqIdClashTracker) {
private val table = mutableMapOf<IrDeclaration, UniqId>()
constructor(mangler: KotlinMangler) : this(mangler, UniqIdClashTracker.DEFAULT_TRACKER)
protected open fun loadKnownBuiltins(builtIns: IrBuiltIns, startIndex: Long): Long {
var index = startIndex
builtIns.knownBuiltins.forEach {
@@ -34,7 +45,7 @@ abstract class GlobalDeclarationTable(private val mangler: KotlinMangler) {
open fun computeUniqIdByDeclaration(declaration: IrDeclaration): UniqId {
return table.getOrPut(declaration) {
UniqId(mangler.hashedMangleImpl(declaration), false)
UniqId(mangler.hashedMangleImpl(declaration), false).also { clashTracker.commit(declaration, it) }
}
}