From 4b6202c9024d8afba2fecf9c5649e15a2fe23217 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 20 Nov 2019 10:56:53 +0100 Subject: [PATCH] JVM_IR. Support inlining of bound CR --- .../kotlin/codegen/inline/MethodInliner.kt | 5 ++++- .../kotlin/backend/jvm/codegen/IrInlineCodegen.kt | 8 +++++--- .../inlineValueParameterInsteadOfReceiver.kt | 15 +++++++++++++++ .../BlackBoxInlineCodegenTestGenerated.java | 5 +++++ ...ileKotlinAgainstInlineKotlinTestGenerated.java | 5 +++++ .../ir/IrBlackBoxInlineCodegenTestGenerated.java | 5 +++++ ...ileKotlinAgainstInlineKotlinTestGenerated.java | 5 +++++ .../IrCallableReferenceInlineTestsGenerated.java | 5 +++++ .../CallableReferenceInlineTestsGenerated.java | 5 +++++ 9 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt index 3d7bd951cb7..76ecc94bd5d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt @@ -438,7 +438,10 @@ class MethodInliner( private fun getNewIndex(`var`: Int): Int { val lambdaInfo = inliningContext.lambdaInfo if (reorderIrLambdaParameters && lambdaInfo is IrExpressionLambda) { - val extensionSize = if (lambdaInfo.isExtensionLambda) lambdaInfo.invokeMethod.argumentTypes[0].size else 0 + val extensionSize = + if (lambdaInfo.isExtensionLambda && !lambdaInfo.isBoundCallableReference) + lambdaInfo.invokeMethod.argumentTypes[0].size + else 0 return when { // v-- extensionSize v-- argsSizeOnStack // |- extension -|- captured -|- real -|- locals -| old descriptor diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index c818efd7f06..a2030c810cf 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -217,14 +217,16 @@ class IrExpressionLambdaImpl( private val loweredMethod = methodSignatureMapper.mapAsmMethod(function.getOrCreateSuspendFunctionViewIfNeeded(context)) - val capturedParamsInDesc: List = - loweredMethod.argumentTypes.drop(if (isExtensionLambda) 1 else 0).take(capturedVars.size) + val capturedParamsInDesc: List = if (isBoundCallableReference) { + loweredMethod.argumentTypes.take(1) + } else loweredMethod.argumentTypes.drop(if (isExtensionLambda) 1 else 0).take(capturedVars.size) override val invokeMethod: Method = loweredMethod.let { Method( it.name, it.returnType, - ((if (isExtensionLambda) it.argumentTypes.take(1) else emptyList()) + + (if (isBoundCallableReference) it.argumentTypes.drop(1) + else (if (isExtensionLambda) it.argumentTypes.take(1) else emptyList()) + it.argumentTypes.drop((if (isExtensionLambda) 1 else 0) + capturedVars.size)).toTypedArray() ) } diff --git a/compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt b/compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt new file mode 100644 index 00000000000..e6b566216ba --- /dev/null +++ b/compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt @@ -0,0 +1,15 @@ +// FILE: 1.kt +package test + +class Z + +class Q { + inline fun f(z: Z) = "OK" +} + +// FILE: 2.kt +import test.* + +fun box(): String { + return Z().run(Q()::f) +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java index 7a61f36083e..d670bd3f06f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -876,6 +876,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index 421d95f1601..2fa4d39db48 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -876,6 +876,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java index 2802dc8f459..b9c3193d8a7 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java @@ -876,6 +876,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java index dd9e68eff66..572ba229ead 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java @@ -876,6 +876,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrCallableReferenceInlineTestsGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrCallableReferenceInlineTestsGenerated.java index ee45a0bce04..544457e7ade 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrCallableReferenceInlineTestsGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrCallableReferenceInlineTestsGenerated.java @@ -146,6 +146,11 @@ public class IrCallableReferenceInlineTestsGenerated extends AbstractIrCallableR runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CallableReferenceInlineTestsGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CallableReferenceInlineTestsGenerated.java index 9b2b49d642c..01558b69d15 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CallableReferenceInlineTestsGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CallableReferenceInlineTestsGenerated.java @@ -146,6 +146,11 @@ public class CallableReferenceInlineTestsGenerated extends AbstractCallableRefer runTest("compiler/testData/codegen/boxInline/callableReference/bound/filter.kt"); } + @TestMetadata("inlineValueParameterInsteadOfReceiver.kt") + public void testInlineValueParameterInsteadOfReceiver() throws Exception { + runTest("compiler/testData/codegen/boxInline/callableReference/bound/inlineValueParameterInsteadOfReceiver.kt"); + } + @TestMetadata("innerGenericConstuctor.kt") public void testInnerGenericConstuctor() throws Exception { runTest("compiler/testData/codegen/boxInline/callableReference/bound/innerGenericConstuctor.kt");