From e2a378bed748de615f5d056a591d3d328213228a Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 26 Mar 2020 10:56:19 +0300 Subject: [PATCH] [JS_IR] More subtle local classes copying in inliner --- .../kotlin/ir/backend/js/JsLoweringPhases.kt | 51 +++++++++++++++---- .../boxInline/anonymousObject/kt8133.kt | 2 - 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index 6906e3836cc..d3bd73ea95e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -8,6 +8,9 @@ package org.jetbrains.kotlin.ir.backend.js 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.lower.optimizations.FoldConstantLowering import org.jetbrains.kotlin.backend.common.lower.optimizations.PropertyAccessorInlineLowering @@ -168,11 +171,40 @@ private val arrayConstructorPhase = makeBodyLoweringPhase( description = "Transform `Array(size) { index -> value }` into a loop" ) +private val sharedVariablesLoweringPhase = makeBodyLoweringPhase( + ::SharedVariablesLowering, + name = "SharedVariablesLowering", + description = "Box captured mutable variables", + prerequisite = setOf(lateinitDeclarationLoweringPhase, lateinitUsageLoweringPhase) +) + +private val localClassesInInlineLambdasPhase = makeBodyLoweringPhase( + ::LocalClassesInInlineLambdasLowering, + name = "LocalClassesInInlineLambdasPhase", + description = "Extract local classes from inline lambdas" +) + +private val localClassesInInlineFunctionsPhase = makeBodyLoweringPhase( + ::LocalClassesInInlineFunctionsLowering, + name = "LocalClassesInInlineFunctionsPhase", + description = "Extract local classes from inline functions" +) + +private val localClassesExtractionFromInlineFunctionsPhase = makeBodyLoweringPhase( + ::LocalClassesExtractionFromInlineFunctionsLowering, + name = "localClassesExtractionFromInlineFunctionsPhase", + description = "Move local classes from inline functions into nearest declaration container", + prerequisite = setOf(localClassesInInlineFunctionsPhase) +) + private val functionInliningPhase = makeBodyLoweringPhase( ::FunctionInlining, name = "FunctionInliningPhase", description = "Perform function inlining", - prerequisite = setOf(expectDeclarationsRemovingPhase) + prerequisite = setOf( + expectDeclarationsRemovingPhase, sharedVariablesLoweringPhase, + localClassesInInlineLambdasPhase, localClassesExtractionFromInlineFunctionsPhase + ) ) private val copyInlineFunctionBodyLoweringPhase = makeDeclarationTransformerPhase( @@ -263,12 +295,6 @@ private val enumEntryRemovalLoweringPhase = makeDeclarationTransformerPhase( prerequisite = setOf(enumUsageLoweringPhase) ) -private val sharedVariablesLoweringPhase = makeBodyLoweringPhase( - ::SharedVariablesLowering, - name = "SharedVariablesLowering", - description = "Box captured mutable variables" -) - private val callableReferenceLowering = makeBodyLoweringPhase( ::CallableReferenceLowering, name = "CallableReferenceLowering", @@ -585,18 +611,21 @@ val loweringList = listOf( expectDeclarationsRemovingPhase, stripTypeAliasDeclarationsPhase, arrayConstructorPhase, + lateinitNullableFieldsPhase, + lateinitDeclarationLoweringPhase, + lateinitUsageLoweringPhase, + sharedVariablesLoweringPhase, + localClassesInInlineLambdasPhase, + localClassesInInlineFunctionsPhase, + localClassesExtractionFromInlineFunctionsPhase, functionInliningPhase, copyInlineFunctionBodyLoweringPhase, createScriptFunctionsPhase, callableReferenceLowering, singleAbstractMethodPhase, - lateinitNullableFieldsPhase, - lateinitDeclarationLoweringPhase, - lateinitUsageLoweringPhase, tailrecLoweringPhase, enumClassConstructorLoweringPhase, enumClassConstructorBodyLoweringPhase, - sharedVariablesLoweringPhase, localDelegatedPropertiesLoweringPhase, localDeclarationsLoweringPhase, localClassExtractionPhase, diff --git a/compiler/testData/codegen/boxInline/anonymousObject/kt8133.kt b/compiler/testData/codegen/boxInline/anonymousObject/kt8133.kt index 12bc99fd6a8..afbe87298a7 100644 --- a/compiler/testData/codegen/boxInline/anonymousObject/kt8133.kt +++ b/compiler/testData/codegen/boxInline/anonymousObject/kt8133.kt @@ -1,5 +1,3 @@ -// TODO: inliner doesn't fix usesite of local object (likely for any local inlined class) -// IGNORE_BACKEND: JS_IR // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt