From 5100cb058f4a9c14b1377dfecef5f343720e1332 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Mon, 18 Oct 2021 21:11:07 +0300 Subject: [PATCH] [JS IR] local var clashes --- .../backend/js/utils/JsGenerationContext.kt | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt index 825d13513d6..d5f3d95ce7f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt @@ -5,10 +5,8 @@ package org.jetbrains.kotlin.ir.backend.js.utils -import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName -import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol @@ -49,20 +47,28 @@ class JsGenerationContext( ) } + private val nameCache = mutableMapOf() + fun getNameForValueDeclaration(declaration: IrDeclarationWithName): JsName { - val name = localNames!!.variableNames.names[declaration] - ?: error("Variable name is not found ${declaration.name}") - return JsName(name, false) + return nameCache.getOrPut(declaration) { + val name = localNames!!.variableNames.names[declaration] + ?: error("Variable name is not found ${declaration.name}") + JsName(name, true) + } } fun getNameForLoop(loop: IrLoop): JsName? { - val name = localNames!!.localLoopNames.names[loop] ?: return null - return JsName(name, false) + return nameCache.getOrPut(loop) { + val name = localNames!!.localLoopNames.names[loop] ?: return null + JsName(name, true) + } } fun getNameForReturnableBlock(block: IrReturnableBlock): JsName? { - val name = localNames!!.localReturnableBlockNames.names[block] ?: return null - return JsName(name, false) + return nameCache.getOrPut(block) { + val name = localNames!!.localReturnableBlockNames.names[block] ?: return null + return JsName(name, true) + } } fun checkIfJsCode(symbol: IrFunctionSymbol): Boolean = symbol == staticContext.backendContext.intrinsics.jsCode