From 30c00f7983bca3cd486b228346283b5e98f45d82 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 19 Jul 2023 12:40:55 +0200 Subject: [PATCH] [IR] Specify explicitly that classes from Java can be interpreted In early prototypes of interpreter, it was easier to assume that all classes from Java can be interpreted and fix something if not. Check for Java declaration was done by checking that the package name is starting with "java". But this is actually wrong and can lead to errors when some code is declared in "java" something package, but is not from Java stdlib. #KT-60467 Fixed --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/ir/interpreter/state/Wrapper.kt | 18 +++++++++++------- .../inJavaLangPackage.kt | 19 +++++++++++++++++++ .../involvesIrInterpreter/inJavaPackage.kt | 17 +++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../fir/FirJsCodegenBoxTestGenerated.java | 12 ++++++++++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 12 ++++++++++++ .../ir/IrJsES6CodegenBoxTestGenerated.java | 12 ++++++++++++ .../FirNativeCodegenBoxTestGenerated.java | 12 ++++++++++++ .../FirNativeCodegenBoxTestNoPLGenerated.java | 12 ++++++++++++ .../NativeCodegenBoxTestGenerated.java | 12 ++++++++++++ .../NativeCodegenBoxTestNoPLGenerated.java | 12 ++++++++++++ 15 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt create mode 100644 compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.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 e24bcd8c512..ed5f6904ca5 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 @@ -28515,6 +28515,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() 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 b1b34a68acd..48fbb3e5997 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 @@ -28515,6 +28515,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt index 01007f5cbff..5437f0c25b6 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt @@ -20,8 +20,6 @@ import java.lang.invoke.MethodHandle import java.lang.invoke.MethodHandles import java.lang.invoke.MethodType import java.util.* -import kotlin.collections.HashMap -import kotlin.collections.LinkedHashMap internal class Wrapper(val value: Any, override val irClass: IrClass, environment: IrInterpreterEnvironment) : Complex { override val fields: Fields = mutableMapOf() @@ -100,6 +98,13 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen "kotlin.text.RegexOption", "kotlin.text.Regex", "kotlin.text.Regex.Companion", "kotlin.text.MatchGroup", ) + private val intrinsicJavaClasses = setOf( + "java.lang.StringBuilder", "java.util.ArrayList", + "java.util.LinkedHashMap", "java.util.LinkedHashSet", + "java.lang.Exception", "java.util.NoSuchElementException", "java.lang.NullPointerException", + "java.lang.IllegalArgumentException", "java.lang.ArithmeticException", "java.lang.UnsupportedOperationException", + ) + private val intrinsicFunctionToHandler = mapOf( "Array.kotlin.collections.asList()" to "kotlin.collections.ArraysKt", "kotlin.collections.mutableListOf(Array)" to "kotlin.collections.CollectionsKt", @@ -111,8 +116,7 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen private val ranges = setOf("kotlin.ranges.CharRange", "kotlin.ranges.IntRange", "kotlin.ranges.LongRange") - private fun IrFunction.getSignature(): String { - val fqName = this.fqName + private fun IrFunction.getSignature(fqName: String = this.fqName): String { val receiver = (dispatchReceiverParameter ?: extensionReceiverParameter)?.type?.getOnlyName()?.let { "$it." } ?: "" return this.valueParameters.joinToString(prefix = "$receiver$fqName(", postfix = ")") { it.type.getOnlyName() } } @@ -122,11 +126,11 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen } fun mustBeHandledWithWrapper(declaration: IrDeclarationWithName): Boolean { - if (declaration is IrFunction) return declaration.getSignature() in intrinsicFunctionToHandler val fqName = declaration.fqName return when { - fqName in ranges && (declaration as IrClass).primaryConstructor!!.body == null -> true - else -> fqName in intrinsicClasses || fqName.startsWith("java") + declaration is IrFunction -> declaration.getSignature(fqName) in intrinsicFunctionToHandler + fqName in ranges && (declaration as IrClass).primaryConstructor?.body == null -> true + else -> fqName in intrinsicClasses || fqName in intrinsicJavaClasses } } diff --git a/compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt b/compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt new file mode 100644 index 00000000000..b406ad0d6bc --- /dev/null +++ b/compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt @@ -0,0 +1,19 @@ +// Can't be tested in JVM because frontend doesn't allow such code +// TARGET_BACKEND: JS_IR +// TARGET_BACKEND: NATIVE +// WITH_STDLIB + +package java.lang + +object Math { + const val E: Double = kotlin.math.E + const val PI: Double = kotlin.math.PI + const val OK: String = "OK" +} + +const val usageE = Math.E +const val usagePI = Math.PI + +fun box(): String { + return Math.OK +} diff --git a/compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt b/compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt new file mode 100644 index 00000000000..8fabb3327d2 --- /dev/null +++ b/compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM_IR +// TARGET_BACKEND: JS_IR +// TARGET_BACKEND: NATIVE + +package java2d + +class A { + fun getConst() = OK + + companion object { + const val OK = "OK" + } +} + +fun box(): String { + return A().getConst() +} 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 ef55b607dcf..c47f47165ab 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 @@ -28515,6 +28515,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() 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 acb05213f0d..008f69a6ee9 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 @@ -28515,6 +28515,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() 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 5eefa2213a7..b9a44c8035f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -24054,6 +24054,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { runTest("compiler/testData/codegen/box/involvesIrInterpreter/intOperations.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 8061f91cd0c..7f6e9c9a705 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -21093,6 +21093,18 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index cafa32e03c9..e49f7eb1ea1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -21093,6 +21093,18 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 8a5348850cf..5f88d21efcf 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -21093,6 +21093,18 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index e087ceba3e7..c1b226c119f 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -23900,6 +23900,18 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java index 77371eca0f6..f04b093767a 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java @@ -24364,6 +24364,18 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 442aef508ca..81d581bbf57 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -23669,6 +23669,18 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java index 0d4c85e9034..fd600f2ff19 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java @@ -23901,6 +23901,18 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT runTest("compiler/testData/codegen/box/involvesIrInterpreter/floatOperations.kt"); } + @Test + @TestMetadata("inJavaLangPackage.kt") + public void testInJavaLangPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaLangPackage.kt"); + } + + @Test + @TestMetadata("inJavaPackage.kt") + public void testInJavaPackage() throws Exception { + runTest("compiler/testData/codegen/box/involvesIrInterpreter/inJavaPackage.kt"); + } + @Test @TestMetadata("intOperations.kt") public void testIntOperations() throws Exception {