From 68117faa73995c285960da57a16abff94e8a9059 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Thu, 20 Jan 2022 20:19:01 +0300 Subject: [PATCH] [JS Legacy] Add an implicit cast to int for the mod operation ^KT-45620 Fixed --- .../jetbrains/kotlin/js/test/BoxJsTestGenerated.java | 6 ++++++ .../factories/PrimitiveBinaryOperationFIF.java | 12 ++++++++++++ js/js.translator/testData/box/number/intMod.kt | 2 -- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java index 802c352b33c..8a81d4a5cf8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java @@ -7746,6 +7746,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/number/intIncDecOverflow.kt"); } + @Test + @TestMetadata("intMod.kt") + public void testIntMod() throws Exception { + runTest("js/js.translator/testData/box/number/intMod.kt"); + } + @Test @TestMetadata("intOverflow.kt") public void testIntOverflow() throws Exception { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java index cb5e9c42a8d..1a3c5c7e177 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java @@ -83,6 +83,14 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { } }; + private static final BinaryOperationIntrinsicBase NUMBER_REM_INTRINSIC = new BinaryOperationIntrinsicBase() { + @NotNull + @Override + public JsExpression doApply(@NotNull JsExpression left, @NotNull JsExpression right, @NotNull TranslationContext context) { + return JsAstUtils.toInt32(JsAstUtils.mod(left, right)); + } + }; + @NotNull private static final BinaryOperationIntrinsicBase BUILTINS_COMPARE_TO_INTRINSIC = new BinaryOperationIntrinsicBase() { @NotNull @@ -120,6 +128,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { private static final DescriptorPredicate BOOLEAN_OPERATIONS = pattern("Boolean.or|and|xor"); private static final DescriptorPredicate STRING_PLUS = pattern("String.plus"); private static final DescriptorPredicate INT_MULTIPLICATION = pattern("Int.times(Int)"); + private static final DescriptorPredicate NUMBER_REM = pattern("Byte|Short|Int.rem(Byte|Short|Int)"); private static final DescriptorPredicate CHAR_RANGE_TO = pattern("Char.rangeTo(Char)"); private static final DescriptorPredicate NUMBER_RANGE_TO = pattern("Byte|Short|Int.rangeTo(Byte|Short|Int)"); @@ -161,6 +170,9 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { if (INT_MULTIPLICATION.test(descriptor)) { return INT_MULTIPLICATION_INTRINSIC; } + if (NUMBER_REM.test(descriptor)) { + return NUMBER_REM_INTRINSIC; + } if (NUMBER_RANGE_TO.test(descriptor)) { return new RangeToIntrinsic(descriptor); } diff --git a/js/js.translator/testData/box/number/intMod.kt b/js/js.translator/testData/box/number/intMod.kt index 90cf163eb3b..780900a7295 100644 --- a/js/js.translator/testData/box/number/intMod.kt +++ b/js/js.translator/testData/box/number/intMod.kt @@ -1,5 +1,3 @@ -// DONT_TARGET_EXACT_BACKEND: JS - fun testModNegativeInt() { // wrapper prevents the constants folding infix fun Int.myModInt(y: Int): Any = this % y