diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt index 3ebc0afa6db..f07796bd033 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt @@ -3,6 +3,9 @@ package org.jetbrains.kotlin.backend.konan import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.lower.inline.FunctionInlining +import org.jetbrains.kotlin.backend.common.lower.inline.LocalClassesExtractionFromInlineFunctionsLowering +import org.jetbrains.kotlin.backend.common.lower.inline.LocalClassesInInlineFunctionsLowering +import org.jetbrains.kotlin.backend.common.lower.inline.LocalClassesInInlineLambdasLowering import org.jetbrains.kotlin.backend.common.lower.loops.ForLoopsLowering import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.konan.lower.* @@ -86,20 +89,57 @@ internal val arrayConstructorPhase = makeKonanModuleLoweringPhase( description = "Transform `Array(size) { index -> value }` into a loop" ) +internal val lateinitPhase = makeKonanModuleOpPhase( + { context, irModule -> + NullableFieldsForLateinitCreationLowering(context).lower(irModule) + NullableFieldsDeclarationLowering(context).lower(irModule) + LateinitUsageLowering(context).lower(irModule) + }, + name = "Lateinit", + description = "Lateinit properties lowering" +) + +internal val sharedVariablesPhase = makeKonanModuleLoweringPhase( + ::SharedVariablesLowering, + name = "SharedVariables", + description = "Shared variable lowering", + prerequisite = setOf(lateinitPhase) +) + +internal val extractLocalClassesFromInlineBodies = namedIrModulePhase( + lower = object : SameTypeCompilerPhase { + override fun invoke(phaseConfig: PhaseConfig, phaserState: PhaserState, context: Context, input: IrModuleFragment): IrModuleFragment { + LocalClassesInInlineLambdasLowering(context).run { + input.files.forEach { lower(it) } + } + LocalClassesInInlineFunctionsLowering(context).run { + input.files.forEach { lower(it) } + } + LocalClassesExtractionFromInlineFunctionsLowering(context).run { + input.files.forEach { lower(it) } + } + return input + } + }, + name = "ExtractLocalClassesFromInlineBodies", + description = "Extraction of local classes from inline bodies", + prerequisite = setOf(sharedVariablesPhase), + nlevels = 0, + actions = modulePhaseActions +) + internal val inlinePhase = namedIrModulePhase( lower = object : SameTypeCompilerPhase { override fun invoke(phaseConfig: PhaseConfig, phaserState: PhaserState, context: Context, input: IrModuleFragment): IrModuleFragment { FunctionInlining(context).run { - input.files.forEach { - lower(it) - } + input.files.forEach { lower(it) } } return input } }, name = "Inline", description = "Functions inlining", - prerequisite = setOf(lowerBeforeInlinePhase, arrayConstructorPhase), + prerequisite = setOf(lowerBeforeInlinePhase, arrayConstructorPhase, extractLocalClassesFromInlineBodies), nlevels = 0, actions = modulePhaseActions ) @@ -116,17 +156,6 @@ internal val lowerAfterInlinePhase = makeKonanModuleOpPhase( /* IrFile phases */ -internal val lateinitPhase = makeKonanFileOpPhase( - { context, irFile -> - NullableFieldsForLateinitCreationLowering(context).lower(irFile) - NullableFieldsDeclarationLowering(context).lower(irFile) - LateinitUsageLowering(context).lower(irFile) - }, - name = "Lateinit", - description = "Lateinit properties lowering", - prerequisite = setOf(inlinePhase) -) - // TODO make all lambda-related stuff work with IrFunctionExpression and drop this phase (see kotlin: dd3f8ecaacd) internal val provisionalFunctionExpressionPhase = makeKonanModuleLoweringPhase( { ProvisionalFunctionExpressionLowering() }, @@ -153,13 +182,6 @@ internal val initializersPhase = makeKonanFileLoweringPhase( prerequisite = setOf(enumConstructorsPhase) ) -internal val sharedVariablesPhase = makeKonanFileLoweringPhase( - ::SharedVariablesLowering, - name = "SharedVariables", - description = "Shared variable lowering", - prerequisite = setOf(initializersPhase) -) - internal val localFunctionsPhase = makeKonanFileOpPhase( op = { context, irFile -> LocalDelegatedPropertiesLowering().lower(irFile) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index a520289f1b0..197b8f93ba0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -326,18 +326,19 @@ internal val allLoweringsPhase = namedIrModulePhase( stripTypeAliasDeclarationsPhase then lowerBeforeInlinePhase then arrayConstructorPhase then + lateinitPhase then + sharedVariablesPhase then + extractLocalClassesFromInlineBodies then inlinePhase then provisionalFunctionExpressionPhase then lowerAfterInlinePhase then performByIrFile( name = "IrLowerByFile", description = "IR Lowering by file", - lower = lateinitPhase then - forLoopsPhase then + lower = forLoopsPhase then stringConcatenationPhase then enumConstructorsPhase then initializersPhase then - sharedVariablesPhase then localFunctionsPhase then tailrecPhase then defaultParameterExtentPhase then