From 3b16fa6af93b3d2a5a46762ea7bfca84008d40dd Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 12 Dec 2018 20:26:30 +0300 Subject: [PATCH] Do not generate interface delegation for default parameter stubs --- .../common/lower/DefaultArgumentStubGenerator.kt | 11 ++++------- .../kotlin/backend/jvm/codegen/FunctionCodegen.kt | 3 +-- .../backend/jvm/lower/InterfaceDelegationLowering.kt | 1 + .../kotlin/backend/jvm/lower/InterfaceLowering.kt | 3 +-- .../jvm/lower/StaticDefaultFunctionLowering.kt | 6 ++---- .../kotlin/ir/declarations/IrDeclarationOrigin.kt | 1 + 6 files changed, 10 insertions(+), 15 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index 382ecc0df30..71a330d5f2e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -69,7 +69,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo } val newIrFunction = - irFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods) + irFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods) log { "$irFunction -> $newIrFunction" } val builder = context.createIrBuilder(newIrFunction.symbol) @@ -273,7 +273,7 @@ open class DefaultParameterInjector constructor( val keyFunction = declaration.findSuperMethodWithDefaultArguments()!! val realFunction = - keyFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInline) + keyFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, skipInline) log { "$declaration -> $realFunction" } val maskValues = Array((declaration.valueParameters.size + 31) / 32) { 0 } @@ -403,7 +403,7 @@ private fun IrFunction.generateDefaultsFunctionImpl( val baseFun = baseFunSymbol.owner if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods)) { val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) { - DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER + IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER } else { IrDeclarationOrigin.FAKE_OVERRIDE } @@ -447,7 +447,7 @@ private fun buildFunctionDeclaration(irFunction: IrFunction, origin: IrDeclarati IrSimpleFunctionSymbolImpl(descriptor), name, irFunction.visibility, - if (irFunction.modality === Modality.ABSTRACT) Modality.OPEN else irFunction.modality, + Modality.FINAL, irFunction.returnType, irFunction.isInline, false, @@ -471,9 +471,6 @@ private fun IrFunction.generateDefaultsFunction( generateDefaultsFunctionImpl(context, origin, skipInlineMethods) } -object DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER : - IrDeclarationOriginImpl("DEFAULT_PARAMETER_EXTENT") - private fun IrFunction.valueParameter(index: Int, name: Name, type: IrType): IrValueParameter { val parameterDescriptor = WrappedValueParameterDescriptor() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index e54df92e947..8c243f4e976 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.backend.jvm.codegen -import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.descriptors.JvmDescriptorWithExtraFlags import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES @@ -62,7 +61,7 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class } private fun calculateMethodFlags(isStatic: Boolean): Int { - if (irFunction.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER) { + if (irFunction.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER) { return Opcodes.ACC_PUBLIC or Opcodes.ACC_SYNTHETIC.let { if (irFunction is IrConstructor) it else it or Opcodes.ACC_BRIDGE or Opcodes.ACC_STATIC } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt index c81f4bdfb3f..e0c8706944c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt @@ -135,5 +135,6 @@ class InterfaceDelegationLowering(val context: JvmBackendContext) : IrElementTra private fun IrSimpleFunction.isDefinitelyNotDefaultImplsMethod() = resolveFakeOverride()?.let { origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB } == true || + origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index 9d8ff272518..a425959afb1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.ClassLoweringPass 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.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER import org.jetbrains.kotlin.backend.common.lower.InitializersLowering.Companion.clinitName import org.jetbrains.kotlin.backend.common.lower.VariableRemapper import org.jetbrains.kotlin.backend.jvm.JvmBackendContext @@ -53,7 +52,7 @@ class InterfaceLowering(val context: JvmBackendContext) : IrElementTransformerVo } val defaultBodies = irClass.declarations.filterIsInstance().filter { - it.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER + it.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER } irClass.declarations.removeAll(privateToRemove) irClass.declarations.removeAll(defaultBodies) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt index 4a39363a69a..060c09f0a51 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt @@ -18,23 +18,21 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.ClassLoweringPass -import org.jetbrains.kotlin.backend.common.lower.DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER -import org.jetbrains.kotlin.backend.common.makePhase import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid class StaticDefaultFunctionLowering() : IrElementTransformerVoid(), ClassLoweringPass { constructor(@Suppress("UNUSED_PARAMETER") context: BackendContext) : this() - override fun lower(irClass: IrClass) { irClass.accept(this, null) } override fun visitFunction(declaration: IrFunction): IrStatement { - return if (declaration.origin == DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) { + return if (declaration.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) { createStaticFunctionWithReceivers(declaration.parent, declaration.name, declaration) } else { super.visitFunction(declaration) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt index bf6807cc486..bbf0c369005 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt @@ -28,6 +28,7 @@ interface IrDeclarationOrigin { object DELEGATED_PROPERTY_ACCESSOR : IrDeclarationOriginImpl("DELEGATED_PROPERTY_ACCESSOR") object DELEGATED_MEMBER : IrDeclarationOriginImpl("DELEGATED_MEMBER") object ENUM_CLASS_SPECIAL_MEMBER : IrDeclarationOriginImpl("ENUM_CLASS_SPECIAL_MEMBER") + object FUNCTION_FOR_DEFAULT_PARAMETER : IrDeclarationOriginImpl("FUNCTION_FOR_DEFAULT_PARAMETER") object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER") object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")