From 291d52820c635f3793db1dbf277eddb855b3042f Mon Sep 17 00:00:00 2001 From: "Evgeniy.Zhelenskiy" Date: Wed, 26 Jul 2023 09:35:07 +0200 Subject: [PATCH] [Reflection] Use reference equality to determine that a callable reference is bound It helps to avoid problems when receiver object implements structural equals violating the equality contract #KT-60709 --- .../FirLightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ ...nWithIrFakeOverrideGeneratorTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/box/reflection/callBy/kt60709.kt | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ ...BlackBoxCodegenWithIrInlinerTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../kotlin/reflect/jvm/internal/KFunctionImpl.kt | 2 +- .../kotlin/reflect/jvm/internal/KPropertyImpl.kt | 2 +- 10 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/callBy/kt60709.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 c8e0e619c4f..337ad4a23c7 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 @@ -45162,6 +45162,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index dc56aedf50a..ae2c39cfe67 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -45162,6 +45162,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() 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 a72df4c12d7..2da7f94913d 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 @@ -45162,6 +45162,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() throws Exception { diff --git a/compiler/testData/codegen/box/reflection/callBy/kt60709.kt b/compiler/testData/codegen/box/reflection/callBy/kt60709.kt new file mode 100644 index 00000000000..2e7469ffdc9 --- /dev/null +++ b/compiler/testData/codegen/box/reflection/callBy/kt60709.kt @@ -0,0 +1,15 @@ +// TARGET_BACKEND: JVM + +// WITH_REFLECT + +class Eq { + override fun equals(other: Any?): Boolean = true + override fun toString(): String = "1" + val x: String get() = "2" +} + +fun box(): String { + require(Eq()::toString.callBy(mapOf()) == "1") + require(Eq()::x.callBy(mapOf()) == "2") + 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 da270e6d78e..d7d04ca6362 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 @@ -42390,6 +42390,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() throws Exception { 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 7191708c6a9..ff5fde70c19 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 @@ -45162,6 +45162,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() 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 bb488a85499..92a90510dbc 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 @@ -45162,6 +45162,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @Test + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @Test @TestMetadata("kt61304.kt") public void testKt61304() 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 1a9014abf86..d64d2e1f048 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -35884,6 +35884,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt"); } + @TestMetadata("kt60709.kt") + public void testKt60709() throws Exception { + runTest("compiler/testData/codegen/box/reflection/callBy/kt60709.kt"); + } + @TestMetadata("kt61304.kt") public void testKt61304() throws Exception { runTest("compiler/testData/codegen/box/reflection/callBy/kt61304.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KFunctionImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KFunctionImpl.kt index 0d2ee46f69c..942942fc038 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KFunctionImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KFunctionImpl.kt @@ -53,7 +53,7 @@ internal class KFunctionImpl private constructor( descriptor ) - override val isBound: Boolean get() = rawBoundReceiver != CallableReference.NO_RECEIVER + override val isBound: Boolean get() = rawBoundReceiver !== CallableReference.NO_RECEIVER override val descriptor: FunctionDescriptor by ReflectProperties.lazySoft(descriptorInitialValue) { container.findFunctionDescriptor(name, signature) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt index fa9596aba7e..f43337df170 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt @@ -47,7 +47,7 @@ internal abstract class KPropertyImpl private constructor( val boundReceiver get() = rawBoundReceiver.coerceToExpectedReceiverType(descriptor) - override val isBound: Boolean get() = rawBoundReceiver != CallableReference.NO_RECEIVER + override val isBound: Boolean get() = rawBoundReceiver !== CallableReference.NO_RECEIVER private val _javaField = lazy(PUBLICATION) { when (val jvmSignature = RuntimeTypeMapper.mapPropertySignature(descriptor)) {