[IR SERIALIZATION] Handle UniqId clashes
This commit is contained in:
+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.DescriptorTable
|
||||
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 {
|
||||
loadKnownBuiltins()
|
||||
currentIndex = 0
|
||||
if (uniqId in commitedUniqIds) {
|
||||
val clashedDeclaration = commitedUniqIds[uniqId]!!
|
||||
// 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