From 7747643945da5eda9f25a1c0690e29fd1a699c3a Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 24 Apr 2023 18:32:35 +0200 Subject: [PATCH] [IR] Filter `chars` and `codePoints` from allowed to interpret function These two functions apparently are represented in Kotlin as methods of `kotlin.String`. Because of that we accidentally treated them as builtins. To also minimize such cases, added filtration by return type. We are allowing to interpret only these functions that have primitive or unsigned return type. #KT-57028 Fixed --- .../FirLightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ .../ir/interpreter/checker/EvaluationMode.kt | 8 +++++++- .../codegen/box/involvesIrInterpreter/kt57028.kt | 14 ++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ ...rBlackBoxCodegenWithIrInlinerTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ 8 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 953ccfd62cf..b2bc0eb5bf4 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -28333,6 +28333,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @Test + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @Test @TestMetadata("kt57313.kt") public void testKt57313() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index fc73df212e7..f16e1600e89 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -28333,6 +28333,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @Test + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @Test @TestMetadata("kt57313.kt") public void testKt57313() throws Exception { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt index 40df275f562..82b787546e1 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt @@ -51,7 +51,10 @@ enum class EvaluationMode(protected val mustCheckBody: Boolean) { ONLY_BUILTINS(mustCheckBody = false) { private val forbiddenMethodsOnPrimitives = setOf("inc", "dec", "rangeTo", "rangeUntil", "hashCode") - private val forbiddenMethodsOnStrings = setOf("subSequence", "hashCode", "") + private val forbiddenMethodsOnStrings = setOf( + "subSequence", "hashCode", "", + "chars", "codePoints" // from java.lang.CharSequence; they are represented as member declarations from "kotlin.String" + ) private val allowedExtensionFunctions = setOf( "kotlin.floorDiv", "kotlin.mod", "kotlin.NumbersKt.floorDiv", "kotlin.NumbersKt.mod", "kotlin." ) @@ -65,6 +68,9 @@ enum class EvaluationMode(protected val mustCheckBody: Boolean) { override fun canEvaluateFunction(function: IrFunction, context: IrCall?): Boolean { if (function.property?.isConst == true) return true + val returnType = function.returnType + if (!returnType.isPrimitiveType() && !returnType.isString() && !returnType.isUnsignedType()) return false + val fqName = function.fqNameWhenAvailable?.asString() val parent = function.parentClassOrNull val parentType = parent?.defaultType diff --git a/compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt b/compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt new file mode 100644 index 00000000000..a47a21938b4 --- /dev/null +++ b/compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt @@ -0,0 +1,14 @@ +// TARGET_BACKEND: JVM +// WITH_STDLIB +// FULL_JDK + +// java.lang.NoSuchMethodError: java.lang.String.chars +// IGNORE_BACKEND: ANDROID +import kotlin.streams.toList + +fun box(): String { + val shoulNotBeEveluated1 = "HelloWorld".chars() + val shoulNotBeEveluated2 = "HelloWorld".codePoints() + val shoulNotBeEveluated3 = "HelloWorld".chars().toList().groupBy { it }.map { it.key to it.value.size }.joinToString().also(::println) + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index c0cead7105d..51d79aae138 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -27199,6 +27199,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @Test + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/involvesIrInterpreter/intrinsicConst") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 15d2a45863f..9ca8a1719ac 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -28333,6 +28333,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @Test + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @Test @TestMetadata("kt57313.kt") public void testKt57313() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index b557c937368..ff323fe1dce 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -28333,6 +28333,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @Test + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @Test @TestMetadata("kt57313.kt") public void testKt57313() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1be2f1c8190..42ec02ad685 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -22952,6 +22952,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt56215.kt"); } + @TestMetadata("kt57028.kt") + public void testKt57028() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/kt57028.kt"); + } + @TestMetadata("compiler/testData/codegen/box/involvesIrInterpreter/intrinsicConst") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)