From 6854135077833fc97970615bd76aee345d97c81a Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 18 Jan 2018 15:21:19 +0300 Subject: [PATCH] Support crossinline suspend lambda as parameter of inline function Use fake continuation instead of ALOAD 0 while inlining Do not generate state machine for inner lambdas and inner objects, which capture crossinline suspend lambda. #KT-19159: Fixed --- .idea/misc.xml | 1 + .../kotlin/codegen/ExpressionCodegen.java | 2 +- .../kotlin/codegen/FunctionCodegen.java | 10 +- .../binding/CodegenAnnotatingVisitor.java | 71 ++++- .../codegen/binding/CodegenBinding.java | 3 + .../jetbrains/kotlin/codegen/codegenUtil.kt | 16 ++ .../codegen/context/InlineLambdaContext.kt | 2 +- .../codegen/coroutines/CoroutineCodegen.kt | 22 +- .../CoroutineTransformerMethodVisitor.kt | 102 +++++--- .../SuspendFunctionGenerationStrategy.kt | 66 ++++- .../coroutines/coroutineCodegenUtil.kt | 16 +- .../inline/AnonymousObjectTransformer.kt | 116 ++++++++- .../kotlin/codegen/inline/InliningContext.kt | 21 +- .../kotlin/codegen/inline/LambdaInfo.kt | 15 +- .../kotlin/codegen/inline/MethodInliner.kt | 91 ++++++- .../codegen/inline/ParametersBuilder.kt | 15 +- .../codegen/inline/SamWrapperTransformer.kt | 2 +- .../codegen/inline/TransformationInfo.kt | 12 +- .../codegen/inline/inlineCodegenUtils.kt | 22 ++ .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 3 +- .../resolve/calls/checkers/InlineChecker.kt | 3 +- .../checkers/InlineParameterChecker.kt | 12 +- .../kotlin/resolve/inline/InlineUtil.java | 5 +- .../crossInlineWithCapturedOuterReceiver.kt | 9 +- .../boxInline/suspend/capturedVariables.kt | 58 +++++ ...endLambdaInsideCrossinlineSuspendLambda.kt | 38 +++ .../defaultValueCrossinline.kt | 100 +++++++ .../defaultParameter/defaultValueInline.kt | 52 ++++ .../inlineOrdinaryOfCrossinlineSuspend.kt | 101 +++++++ .../inlineOrdinaryOfNoinlineSuspend.kt | 128 +++++++++ .../suspend/inlineSuspendContinuation.kt | 111 ++++++++ .../inlineSuspendOfCrossinlineOrdinary.kt | 109 ++++++++ .../inlineSuspendOfCrossinlineSuspend.kt | 134 ++++++++++ .../inlineSuspendOfNoinlineOrdinary.kt | 109 ++++++++ .../suspend/inlineSuspendOfNoinlineSuspend.kt | 163 ++++++++++++ .../suspend/inlineSuspendOfOrdinary.kt | 56 ++++ .../suspend/inlineSuspendOfSuspend.kt | 57 ++++ .../boxInline/suspend/multipleLocals.kt | 123 +++++++++ .../suspend/multipleSuspensionPoints.kt | 84 ++++++ .../inlineOrdinaryOfCrossinlineSuspend.kt | 105 ++++++++ .../inlineOrdinaryOfNoinlineSuspend.kt | 132 ++++++++++ .../inlineSuspendOfCrossinlineOrdinary.kt | 113 ++++++++ .../inlineSuspendOfCrossinlineSuspend.kt | 138 ++++++++++ .../inlineSuspendOfNoinlineOrdinary.kt | 113 ++++++++ .../inlineSuspendOfNoinlineSuspend.kt | 167 ++++++++++++ .../receiver/inlineSuspendOfOrdinary.kt | 60 +++++ .../receiver/inlineSuspendOfSuspend.kt | 61 +++++ .../suspend/stateMachine/innerLambda.kt | 48 ++++ .../stateMachine/innerLambdaInsideLambda.kt | 53 ++++ .../innerLambdaWithoutCrossinline.kt | 52 ++++ .../suspend/stateMachine/innerMadness.kt | 75 ++++++ .../stateMachine/innerMadnessCallSite.kt | 75 ++++++ .../suspend/stateMachine/innerObject.kt | 56 ++++ .../innerObjectInsideInnerObject.kt | 61 +++++ .../innerObjectSeveralFunctions.kt | 60 +++++ .../innerObjectWithoutCapturingCrossinline.kt | 58 +++++ .../suspend/stateMachine/normalInline.kt | 48 ++++ .../stateMachine/numberOfSuspentions.kt | 68 +++++ .../suspend/tryCatchStackTransform.kt | 84 ++++++ .../crossinlineSuspendValueParameter.kt | 2 + .../inlineOrdinaryOfCrossinlineOrdinary.kt | 37 +++ .../inlineOrdinaryOfCrossinlineSuspend.kt | 41 +++ .../inlineOrdinaryOfNoinlineOrdinary.kt | 36 +++ .../inlineOrdinaryOfNoinlineSuspend.kt | 41 +++ .../inlineOrdinaryOfOrdinary.kt | 43 +++ .../inlineOrdinaryOfSuspend.kt | 43 +++ .../inlineSuspendOfCrossinlineOrdinary.kt | 42 +++ .../inlineSuspendOfCrossinlineSuspend.kt | 44 ++++ .../inlineSuspendOfNoinlineOrdinary.kt | 42 +++ .../inlineSuspendOfNoinlineSuspend.kt | 44 ++++ .../inlineSuspendOfOrdinary.kt | 40 +++ .../inlineSuspendOfSuspend.kt | 45 ++++ .../coroutines/suspendFunctionType/inline.kt | 12 +- .../IrBlackBoxInlineCodegenTestGenerated.java | 246 ++++++++++++++++++ ...otlinAgainstInlineKotlinTestGenerated.java | 246 ++++++++++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 87 +++++++ ...ticsTestWithStdLibUsingJavacGenerated.java | 87 +++++++ .../BlackBoxInlineCodegenTestGenerated.java | 246 ++++++++++++++++++ ...otlinAgainstInlineKotlinTestGenerated.java | 246 ++++++++++++++++++ 80 files changed, 5214 insertions(+), 144 deletions(-) create mode 100644 compiler/testData/codegen/boxInline/suspend/capturedVariables.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/crossinlineSuspendLambdaInsideCrossinlineSuspendLambda.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/defaultParameter/defaultValueCrossinline.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/defaultParameter/defaultValueInline.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineOrdinaryOfCrossinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineOrdinaryOfNoinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendContinuation.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfCrossinlineOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfCrossinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfNoinlineOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfNoinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/inlineSuspendOfSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/multipleLocals.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/multipleSuspensionPoints.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineOrdinaryOfCrossinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineOrdinaryOfNoinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfCrossinlineOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfCrossinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfNoinlineOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfNoinlineSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfOrdinary.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/receiver/inlineSuspendOfSuspend.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerLambda.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerLambdaInsideLambda.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerLambdaWithoutCrossinline.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerMadness.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerMadnessCallSite.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerObject.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerObjectInsideInnerObject.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerObjectSeveralFunctions.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/innerObjectWithoutCapturingCrossinline.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/normalInline.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/stateMachine/numberOfSuspentions.kt create mode 100644 compiler/testData/codegen/boxInline/suspend/tryCatchStackTransform.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/crossinlineSuspendValueParameter.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfNoinlineOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfNoinlineSuspend.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfNoinlineOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfNoinlineSuspend.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 5ba7e95895f..75e2be0a382 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -53,6 +53,7 @@