diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index d41e2d650eb..e761f4ab11f 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -9450,6 +9450,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index f202ad6cd9e..a0d88d354f1 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -178,12 +178,14 @@ open class DefaultArgumentStubGenerator( return createTmpVariable(value, nameHint = parameter.name.asString()) } + protected open fun getOriginForCallToImplementation(): IrStatementOrigin? = null + private fun IrBlockBodyBuilder.dispatchToImplementation( irFunction: IrSimpleFunction, newIrFunction: IrFunction, params: MutableList ): IrExpression { - val dispatchCall = irCall(irFunction.symbol).apply { + val dispatchCall = irCall(irFunction, origin = getOriginForCallToImplementation()).apply { passTypeArgumentsFrom(newIrFunction) dispatchReceiver = newIrFunction.dispatchReceiverParameter?.let { irGet(it) } extensionReceiver = newIrFunction.extensionReceiverParameter?.let { irGet(it) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/StatementOrigins.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/StatementOrigins.kt new file mode 100644 index 00000000000..1bc14a1b40f --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/StatementOrigins.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.jvm + +import org.jetbrains.kotlin.ir.expressions.IrStatementOriginImpl + +interface JvmLoweredStatementOrigin { + object DEFAULT_STUB_CALL_TO_IMPLEMENTATION : IrStatementOriginImpl("DEFAULT_STUB_CALL_TO_IMPLEMENTATION") +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 3f70ef2b8d3..8be73e60330 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen import org.jetbrains.kotlin.backend.common.lower.BOUND_RECEIVER_PARAMETER import org.jetbrains.kotlin.backend.common.lower.SYNTHESIZED_INIT_BLOCK import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.intrinsics.JavaClassProperty import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry @@ -1174,7 +1175,7 @@ class ExpressionCodegen( return IrCallGenerator.DefaultCallGenerator } - if (irFunction == context.mapping.defaultArgumentsDispatchFunction[element.symbol.owner]) { + if (element.origin == JvmLoweredStatementOrigin.DEFAULT_STUB_CALL_TO_IMPLEMENTATION) { return IrInlineDefaultCodegen } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultArgumentStubGenerator.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultArgumentStubGenerator.kt index 74e9a26ff78..d4013920682 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultArgumentStubGenerator.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.common.lower.irNot import org.jetbrains.kotlin.backend.common.lower.irThrow import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin import org.jetbrains.kotlin.backend.jvm.ir.getJvmVisibilityOfDefaultArgumentStub import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* @@ -75,4 +76,7 @@ class JvmDefaultArgumentStubGenerator(override val context: JvmBackendContext) : } ) } + + // Since the call to the underlying implementation in a default stub has different inlining behavior we need to mark it. + override fun getOriginForCallToImplementation() = JvmLoweredStatementOrigin.DEFAULT_STUB_CALL_TO_IMPLEMENTATION } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt index b4b7ffd8835..36725d4b70a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt @@ -43,7 +43,15 @@ class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerV maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacades() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride() ?: return super.visitCall(expression) return super.visitCall(with(expression) { - IrCallImpl(startOffset, endOffset, type, resolved.symbol, expression.typeArgumentsCount, null, superQualifierSymbol).apply { + IrCallImpl( + startOffset, + endOffset, + type, + resolved.symbol, + expression.typeArgumentsCount, + expression.origin, + superQualifierSymbol + ).apply { copyTypeAndValueArgumentsFrom(expression) dispatchReceiver?.let { receiver -> val receiverType = resolved.parentAsClass.defaultType diff --git a/compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt b/compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt new file mode 100644 index 00000000000..cc58156bece --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt @@ -0,0 +1,9 @@ +// IGNORE_BACKEND: JS, JS_IR +@Suppress("RECURSION_IN_INLINE") +inline fun test(p: String = test("OK")): String { + return p +} + +fun box() : String { + return test() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 507a1906ba5..bf5ea7dd022 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10845,6 +10845,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 4b297c5d56a..4089ecaf504 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10845,6 +10845,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index f9c332fbd62..235be01da79 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -9450,6 +9450,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 8988a40fa49..2a57674bdc5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -8020,6 +8020,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index ccbfc9a33d2..535853c06b4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -8020,6 +8020,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 2604d18423f..66b4c70a191 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8020,6 +8020,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/protected.kt"); } + @TestMetadata("recursiveDefaultArguments.kt") + public void testRecursiveDefaultArguments() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/recursiveDefaultArguments.kt"); + } + @TestMetadata("referenceAsArg.kt") public void testReferenceAsArg() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/referenceAsArg.kt");