[IR SERIALIZATION] Handle UniqId clashes
This commit is contained in:
+14
-3
@@ -20,10 +20,21 @@ class DescriptorTable {
|
|||||||
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
|
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We don't manage id clashes anyhow now.
|
interface UniqIdClashTracker {
|
||||||
abstract class GlobalDeclarationTable(private val mangler: KotlinMangler) {
|
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>()
|
private val table = mutableMapOf<IrDeclaration, UniqId>()
|
||||||
|
|
||||||
|
constructor(mangler: KotlinMangler) : this(mangler, UniqIdClashTracker.DEFAULT_TRACKER)
|
||||||
|
|
||||||
protected open fun loadKnownBuiltins(builtIns: IrBuiltIns, startIndex: Long): Long {
|
protected open fun loadKnownBuiltins(builtIns: IrBuiltIns, startIndex: Long): Long {
|
||||||
var index = startIndex
|
var index = startIndex
|
||||||
builtIns.knownBuiltins.forEach {
|
builtIns.knownBuiltins.forEach {
|
||||||
@@ -34,7 +45,7 @@ abstract class GlobalDeclarationTable(private val mangler: KotlinMangler) {
|
|||||||
|
|
||||||
open fun computeUniqIdByDeclaration(declaration: IrDeclaration): UniqId {
|
open fun computeUniqIdByDeclaration(declaration: IrDeclaration): UniqId {
|
||||||
return table.getOrPut(declaration) {
|
return table.getOrPut(declaration) {
|
||||||
UniqId(mangler.hashedMangleImpl(declaration), false)
|
UniqId(mangler.hashedMangleImpl(declaration), false).also { clashTracker.commit(declaration, it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+22
-5
@@ -8,13 +8,30 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
|
|
||||||
class JsDeclarationTable(builtIns: IrBuiltIns, descriptorTable: DescriptorTable) : DeclarationTable(builtIns, descriptorTable, JsMangler) {
|
class JsUniqIdClashTracker: UniqIdClashTracker {
|
||||||
|
private val commitedUniqIds = mutableMapOf<UniqId, IrDeclaration>()
|
||||||
|
|
||||||
override var currentIndex = PUBLIC_LOCAL_UNIQ_ID_EDGE
|
override fun commit(declaration: IrDeclaration, uniqId: UniqId) {
|
||||||
|
if (uniqId.isLocal) return // don't track local ids
|
||||||
|
|
||||||
init {
|
if (uniqId in commitedUniqIds) {
|
||||||
loadKnownBuiltins()
|
val clashedDeclaration = commitedUniqIds[uniqId]!!
|
||||||
currentIndex = 0
|
// TODO: handle clashes properly
|
||||||
|
error("UniqId clash: $uniqId; Existed declaration ${clashedDeclaration.render()} clashed with new ${declaration.render()}")
|
||||||
|
}
|
||||||
|
|
||||||
|
commitedUniqIds[uniqId] = declaration
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class JsGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(JsMangler, JsUniqIdClashTracker()) {
|
||||||
|
private val FUNCTION_INDEX_START: Long = loadKnownBuiltins(builtIns, PUBLIC_LOCAL_UNIQ_ID_EDGE)
|
||||||
|
|
||||||
|
override fun computeUniqIdByDeclaration(declaration: IrDeclaration): UniqId {
|
||||||
|
return if (isBuiltInFunction(declaration)) {
|
||||||
|
UniqId(FUNCTION_INDEX_START + builtInFunctionId(declaration), false)
|
||||||
|
} else super.computeUniqIdByDeclaration(declaration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user