[JS_IR] More subtle local classes copying in inliner

This commit is contained in:
Igor Chevdar
2020-03-26 10:56:19 +03:00
parent 90abf1fda0
commit e2a378bed7
2 changed files with 40 additions and 13 deletions
@@ -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<Lowering>(
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,
@@ -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