From 93dcc48512b240942d1a2bee26a416e0b225d59e Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Thu, 14 Apr 2022 18:03:49 +0200 Subject: [PATCH] fix(KT-50157): prevent boxing for char comparison. --- .../backend/js/lower/AutoboxingTransformer.kt | 20 +++++++++++++++++++ .../testData/box/char/charEquals.kt | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt index f974d58dd7a..041cc8cb8e3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt @@ -18,6 +18,8 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.isPrimitiveArray import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid // Copied and adapted from Kotlin/Native @@ -191,6 +193,24 @@ class AutoboxingTransformer(context: JsCommonBackendContext) : AbstractValueUsag ) } } + + override fun visitCall(expression: IrCall): IrExpression { + if (expression.symbol == irBuiltIns.eqeqeqSymbol && expression.isAllArgumentsHaveType(irBuiltIns.charType)) { + return expression.apply { transformChildrenVoid() } + } else { + return super.visitCall(expression) + } + } + + private fun IrCall.isAllArgumentsHaveType(type: IrType): Boolean { + for (i in 0 until valueArgumentsCount) { + if (getValueArgument(i)?.type != type) { + return false + } + } + return true + } + } private tailrec fun IrExpression.isGetUnit(irBuiltIns: IrBuiltIns): Boolean = diff --git a/js/js.translator/testData/box/char/charEquals.kt b/js/js.translator/testData/box/char/charEquals.kt index 1cf431b9ec1..28b03599238 100644 --- a/js/js.translator/testData/box/char/charEquals.kt +++ b/js/js.translator/testData/box/char/charEquals.kt @@ -7,7 +7,8 @@ fun box(): String { assertEquals(false, 'A' == 'B') assertEquals(false, ('A' as Any) == (65 as Any)) - // FIXME(KT-50157): assertEquals(true, 'A' === 'A') + // FIXME(KT-50157) + assertEquals(true, 'A' === 'A') assertEquals(false, 'A' === 'B') assertEquals(false, ('A' as Any) === (65 as Any))