diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt index d36da88e126..f23f31b2bab 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt @@ -14,7 +14,9 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.impl.IrExternalPackageFragmentSymbolImpl +import org.jetbrains.kotlin.ir.types.isLong import org.jetbrains.kotlin.ir.util.constructors +import org.jetbrains.kotlin.ir.util.findDeclaration import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi2ir.findSingleFunction @@ -177,6 +179,10 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC ) ) + val longCompareToLong: IrSimpleFunction = longClassSymbol.owner.findDeclaration { + it.name == Name.identifier("compareTo") && it.valueParameters[0].type.isLong() + }!! + val charClassSymbol = getInternalClassWithoutPackage("kotlin.Char") val charConstructor = charClassSymbol.constructors.single().owner diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt index a1455e058c8..dba1a9032ea 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt @@ -6,10 +6,11 @@ package org.jetbrains.kotlin.ir.backend.js.lower.calls import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext -import org.jetbrains.kotlin.ir.util.irCall +import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.Name @@ -31,13 +32,29 @@ class EqualityAndComparisonCallsTransformer(context: JsIrBackendContext) : Calls add(irBuiltIns.booleanNotSymbol, intrinsics.jsNot) - add(irBuiltIns.lessFunByOperandType, intrinsics.jsLt) - add(irBuiltIns.lessOrEqualFunByOperandType, intrinsics.jsLtEq) - add(irBuiltIns.greaterFunByOperandType, intrinsics.jsGt) - add(irBuiltIns.greaterOrEqualFunByOperandType, intrinsics.jsGtEq) + add(irBuiltIns.lessFunByOperandType.filterKeys { it != irBuiltIns.long }, intrinsics.jsLt) + add(irBuiltIns.lessOrEqualFunByOperandType.filterKeys { it != irBuiltIns.long }, intrinsics.jsLtEq) + add(irBuiltIns.greaterFunByOperandType.filterKeys { it != irBuiltIns.long }, intrinsics.jsGt) + add(irBuiltIns.greaterOrEqualFunByOperandType.filterKeys { it != irBuiltIns.long }, intrinsics.jsGtEq) + + add(irBuiltIns.lessFunByOperandType[irBuiltIns.long]!!.symbol, transformLongComparison(intrinsics.jsLt)) + add(irBuiltIns.lessOrEqualFunByOperandType[irBuiltIns.long]!!.symbol, transformLongComparison(intrinsics.jsLtEq)) + add(irBuiltIns.greaterFunByOperandType[irBuiltIns.long]!!.symbol, transformLongComparison(intrinsics.jsGt)) + add(irBuiltIns.greaterOrEqualFunByOperandType[irBuiltIns.long]!!.symbol, transformLongComparison(intrinsics.jsGtEq)) } } + private fun transformLongComparison(comparator: IrSimpleFunction): (IrCall) -> IrExpression = { call -> + IrCallImpl( + call.startOffset, + call.endOffset, + comparator.returnType, + comparator.symbol + ).apply { + putValueArgument(0, irCall(call, intrinsics.longCompareToLong, firstArgumentAsDispatchReceiver = true)) + putValueArgument(1, JsIrBuilder.buildInt(irBuiltIns.intType, 0)) + } + } override fun transformCall(call: IrCall): IrExpression { val symbol = call.symbol diff --git a/compiler/testData/codegen/box/ranges/expression/inexactDownToMinValue.kt b/compiler/testData/codegen/box/ranges/expression/inexactDownToMinValue.kt index 5596aab4860..e50e8abab67 100644 --- a/compiler/testData/codegen/box/ranges/expression/inexactDownToMinValue.kt +++ b/compiler/testData/codegen/box/ranges/expression/inexactDownToMinValue.kt @@ -2,9 +2,6 @@ // TODO: muted automatically, investigate should it be ran for JVM_IR or not // IGNORE_BACKEND: JVM_IR -// TODO: muted automatically, investigate should it be ran for JS_IR or not -// IGNORE_BACKEND: JS_IR - // Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT! // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/ranges/expression/inexactToMaxValue.kt b/compiler/testData/codegen/box/ranges/expression/inexactToMaxValue.kt index f5a91d7b96d..59cf1edcb7c 100644 --- a/compiler/testData/codegen/box/ranges/expression/inexactToMaxValue.kt +++ b/compiler/testData/codegen/box/ranges/expression/inexactToMaxValue.kt @@ -2,9 +2,6 @@ // TODO: muted automatically, investigate should it be ran for JVM_IR or not // IGNORE_BACKEND: JVM_IR -// TODO: muted automatically, investigate should it be ran for JS_IR or not -// IGNORE_BACKEND: JS_IR - // Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT! // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/ranges/literal/inexactDownToMinValue.kt b/compiler/testData/codegen/box/ranges/literal/inexactDownToMinValue.kt index 8d573774b8e..a1de3fab8a5 100644 --- a/compiler/testData/codegen/box/ranges/literal/inexactDownToMinValue.kt +++ b/compiler/testData/codegen/box/ranges/literal/inexactDownToMinValue.kt @@ -2,9 +2,6 @@ // TODO: muted automatically, investigate should it be ran for JVM_IR or not // IGNORE_BACKEND: JVM_IR -// TODO: muted automatically, investigate should it be ran for JS_IR or not -// IGNORE_BACKEND: JS_IR - // Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT! // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/ranges/literal/inexactToMaxValue.kt b/compiler/testData/codegen/box/ranges/literal/inexactToMaxValue.kt index 538786e9fba..e3754c2ec74 100644 --- a/compiler/testData/codegen/box/ranges/literal/inexactToMaxValue.kt +++ b/compiler/testData/codegen/box/ranges/literal/inexactToMaxValue.kt @@ -2,9 +2,6 @@ // TODO: muted automatically, investigate should it be ran for JVM_IR or not // IGNORE_BACKEND: JVM_IR -// TODO: muted automatically, investigate should it be ran for JS_IR or not -// IGNORE_BACKEND: JS_IR - // Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT! // WITH_RUNTIME diff --git a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateRangesCodegenTestData.java b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateRangesCodegenTestData.java index 4aaa7c128cc..490045d0f72 100644 --- a/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateRangesCodegenTestData.java +++ b/compiler/tests/org/jetbrains/kotlin/generators/tests/GenerateRangesCodegenTestData.java @@ -119,13 +119,6 @@ public class GenerateRangesCodegenTestData { .replace("\n", LineSeparator.getSystemLineSeparator().getSeparatorString()); } - private static final List IGNORED_FOR_JS_BACKEND = Collections.emptyList(); - - private static final List IGNORED_FOR_JS_IR_BACKEND = Arrays.asList("inexactDownToMinValue.kt", - "inexactToMaxValue.kt"); - - private static final List IGNORED_FOR_NATIVE_BACKEND = Collections.emptyList(); - private static final List WHITELISTED_FOR_JVM_IR_BACKEND = Collections.singletonList("overflowZeroDownToMaxValue.kt"); private static void writeIgnoreBackendDirective(PrintWriter out, String backendName) { @@ -150,16 +143,6 @@ public class GenerateRangesCodegenTestData { writeIgnoreBackendDirective(out, "JVM_IR"); } - if (IGNORED_FOR_JS_BACKEND.contains(file.getName())) { - writeIgnoreBackendDirective(out, "JS"); - } - if (IGNORED_FOR_JS_IR_BACKEND.contains(file.getName())) { - writeIgnoreBackendDirective(out, "JS_IR"); - } - if (IGNORED_FOR_NATIVE_BACKEND.contains(file.getName())) { - writeIgnoreBackendDirective(out, "NATIVE"); - } - out.println("// Auto-generated by " + GenerateRangesCodegenTestData.class.getName() + ". DO NOT EDIT!"); out.println("// WITH_RUNTIME"); out.println();