From 4d50086d355a23b6b14ab38c9dd9ba6651f135d6 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 8 Jul 2019 20:16:06 +0300 Subject: [PATCH] JVM_IR: reorder lowerings Some lowerings have to come before DefaultParameterInjector. --- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 26 +++++++++++-------- .../jvm/lower/CallableReferenceLowering.kt | 2 ++ .../lower/JvmDefaultConstructorLowering.kt | 1 + .../lower/JvmOverloadsAnnotationLowering.kt | 17 ++++++------ .../jvm/lower/SingleAbstractMethodLowering.kt | 4 ++- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index b4625bce8cb..7a198bcb961 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -72,7 +72,7 @@ private val propertiesPhase = makeIrFilePhase( stickyPostconditions = setOf((PropertiesLowering)::checkNoProperties) ) -private val localDeclarationsPhase = makeIrFilePhase( +internal val localDeclarationsPhase = makeIrFilePhase( { context -> LocalDeclarationsLowering(context, object : LocalNameProvider { override fun localName(declaration: IrDeclarationWithName): String = @@ -95,7 +95,7 @@ private val defaultArgumentInjectorPhase = makeIrFilePhase( ::JvmDefaultParameterInjector, name = "DefaultParameterInjector", description = "Transform calls with default arguments into calls to stubs", - prerequisite = setOf(defaultArgumentStubPhase) + prerequisite = setOf(defaultArgumentStubPhase, callableReferencePhase) ) private val innerClassesPhase = makeIrFilePhase( @@ -131,8 +131,21 @@ private val jvmFilePhases = enumWhenPhase then singletonReferencesPhase then + callableReferencePhase then + functionNVarargInvokePhase then localDeclarationsPhase then + + singleAbstractMethodPhase then + addContinuationPhase then + + jvmOverloadsAnnotationPhase then + jvmDefaultConstructorPhase then + + flattenStringConcatenationPhase then + foldConstantLoweringPhase then + computeStringTrimPhase then + defaultArgumentStubPhase then defaultArgumentInjectorPhase then @@ -141,10 +154,6 @@ private val jvmFilePhases = interfaceSuperCallsPhase then interfaceDefaultCallsPhase then - singleAbstractMethodPhase then - addContinuationPhase then - functionNVarargInvokePhase then - innerClassesPhase then innerClassConstructorCallsPhase then forLoopsPhase then @@ -156,16 +165,11 @@ private val jvmFilePhases = makeInitializersPhase(JvmLoweredDeclarationOrigin.CLASS_STATIC_INITIALIZER, true) then collectionStubMethodLowering then bridgePhase then - jvmOverloadsAnnotationPhase then - jvmDefaultConstructorPhase then jvmStaticAnnotationPhase then staticDefaultFunctionPhase then syntheticAccessorPhase then toArrayPhase then - flattenStringConcatenationPhase then - foldConstantLoweringPhase then - computeStringTrimPhase then jvmBuiltinOptimizationLoweringPhase then additionalClassAnnotationPhase then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index 033fbe55950..c6b0a464e2f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.lower.createIrBuilder +import org.jetbrains.kotlin.backend.common.lower.insertCallsToDefaultArgumentStubs import org.jetbrains.kotlin.backend.common.lower.irBlock import org.jetbrains.kotlin.backend.common.lower.irIfThen import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.codegen.isInlineIrExpression import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter +import org.jetbrains.kotlin.backend.jvm.localDeclarationsPhase import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.codegen.PropertyReferenceCodegen import org.jetbrains.kotlin.descriptors.Modality diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt index 957bf7d1a35..e248b02536f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom import org.jetbrains.kotlin.backend.common.lower.createIrBuilder +import org.jetbrains.kotlin.backend.common.lower.insertCallsToDefaultArgumentStubs import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.ir.builders.declarations.addConstructor diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt index 2cf53bcea77..0deea80b00a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt @@ -7,21 +7,18 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase -import org.jetbrains.kotlin.backend.common.deepCopyWithWrappedDescriptors import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom +import org.jetbrains.kotlin.backend.common.lower.insertCallsToDefaultArgumentStubs import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl +import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols @@ -104,9 +101,13 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C } - wrapperIrFunction.body = IrExpressionBodyImpl( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, call - ) + wrapperIrFunction.body = if (target is IrConstructor) { + IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(call)) + } else { + IrExpressionBodyImpl( + UNDEFINED_OFFSET, UNDEFINED_OFFSET, call + ) + } return wrapperIrFunction } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt index 10302b5ad69..1274fe70142 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.irBlock import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.localDeclarationsPhase import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities @@ -36,7 +37,8 @@ import org.jetbrains.kotlin.util.OperatorNameConventions internal val singleAbstractMethodPhase = makeIrFilePhase( ::SingleAbstractMethodLowering, name = "SingleAbstractMethod", - description = "Replace SAM conversions with instances of interface-implementing classes" + description = "Replace SAM conversions with instances of interface-implementing classes", + prerequisite = setOf(localDeclarationsPhase) ) class SingleAbstractMethodLowering(val context: CommonBackendContext) : ClassLoweringPass {