From 84964a76f93dd314e1eeedfa675d8d0be38b431b Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 14 Jun 2016 12:43:49 +0300 Subject: [PATCH] Move generation of coroutines 'invoke' after 'doResume' It's necessary because in next commits 'invoke' will depend on captured variables that are being calculated during 'doResume' calculation --- .../codegen/coroutines/CoroutineCodegen.kt | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt index ae940fbe243..5cd8564adce 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt @@ -75,32 +75,6 @@ class CoroutineCodegen( val classDescriptor = closureContext.contextDescriptor - functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, funDescriptor, - object : FunctionGenerationStrategy.CodegenBased(state) { - override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) { - AsmUtil.genAssignInstanceFieldFromParam( - FieldInfo.createForHiddenField( - typeMapper.mapClass(classDescriptor), - typeMapper.mapType(controllerType), COROUTINE_CONTROLLER_FIELD_NAME), - 1, codegen.v) - - with(codegen.v) { - setLabelValue(LABEL_VALUE_BEFORE_FIRST_SUSPENSION) - - for (parameter in funDescriptor.valueParameters) { - // 0 - this - // 1 - controller - val parametersIndexShift = 2 - AsmUtil.genAssignInstanceFieldFromParam( - parameter.getFieldInfoForCoroutineLambdaParameter(), parametersIndexShift + parameter.index, this) - } - - load(0, AsmTypes.OBJECT_TYPE) - areturn(AsmTypes.OBJECT_TYPE) - } - } - }) - val resumeFunctionDescriptor = createSynthesizedImplementationByName( "resume", @@ -142,6 +116,36 @@ class CoroutineCodegen( generateExceptionHandlingBlock(codegen) } }) + + functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, funDescriptor, + object : FunctionGenerationStrategy.CodegenBased(state) { + override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) { + generateInvokeMethod(codegen, signature) + } + }) + } + + private fun generateInvokeMethod(codegen: ExpressionCodegen, signature: JvmMethodSignature) { + AsmUtil.genAssignInstanceFieldFromParam( + FieldInfo.createForHiddenField( + typeMapper.mapClass(classDescriptor), + typeMapper.mapType(controllerType), COROUTINE_CONTROLLER_FIELD_NAME), + 1, codegen.v) + + with(codegen.v) { + setLabelValue(LABEL_VALUE_BEFORE_FIRST_SUSPENSION) + + for (parameter in funDescriptor.valueParameters) { + // 0 - this + // 1 - controller + val parametersIndexShift = 2 + AsmUtil.genAssignInstanceFieldFromParam( + parameter.getFieldInfoForCoroutineLambdaParameter(), parametersIndexShift + parameter.index, this) + } + + load(0, AsmTypes.OBJECT_TYPE) + areturn(AsmTypes.OBJECT_TYPE) + } } private fun ExpressionCodegen.initializeCoroutineParameters() {