From 3a0c41dca40edbbe1249f491c33c490781f95ac7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 29 Aug 2019 18:30:37 +0200 Subject: [PATCH] JVM IR: do not use KotlinTypeMapper indirectly in CallableReferenceLowering --- .../kotlin/backend/jvm/JvmBackendContext.kt | 13 ++++++++++--- .../backend/jvm/codegen/MethodSignatureMapper.kt | 9 ++++++++- .../backend/jvm/lower/CallableReferenceLowering.kt | 11 +++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index f610bdb7872..bacf9a4de3d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.InlineClassAbi import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor @@ -23,7 +24,10 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.symbols.* +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol +import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable @@ -95,8 +99,11 @@ class JvmBackendContext( internal fun referenceTypeParameter(descriptor: TypeParameterDescriptor): IrTypeParameterSymbol = symbolTable.referenceTypeParameter(descriptor) - internal fun referenceSimpleFunction(descriptor: FunctionDescriptor): IrSimpleFunctionSymbol = - symbolTable.referenceSimpleFunction(descriptor) + internal fun referenceFunction(descriptor: FunctionDescriptor): IrFunctionSymbol = + if (descriptor is ClassConstructorDescriptor) + symbolTable.referenceConstructor(descriptor) + else + symbolTable.referenceSimpleFunction(descriptor) override fun log(message: () -> String) { /*TODO*/ diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index cb73afab878..7cdd49902ec 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -204,6 +204,13 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { writeParameter(sw, JvmMethodParameterKind.RECEIVER, receiverParameter.type, function) } + // This is needed because mapSignature is currently invoked in CallableReferenceLowering before InnerClassesLowering where + // this parameter is transformed to a normal value parameter. + // TODO: do not call mapSignature in CallableReferenceLowering + if (function is IrConstructor && function.dispatchReceiverParameter != null) { + writeParameter(sw, JvmMethodParameterKind.VALUE, function.dispatchReceiverParameter!!.type, function) + } + for (parameter in function.valueParameters) { val type = if (forceSingleValueParameterBoxing(function.descriptor)) parameter.type.makeNullable() else parameter.type writeParameter(sw, JvmMethodParameterKind.VALUE, type, function) @@ -312,7 +319,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { private fun mapOverriddenSpecialBuiltinIfNeeded(callee: IrFunction, superCall: Boolean): JvmMethodSignature? { val overriddenSpecialBuiltinFunction = callee.descriptor.original.getOverriddenBuiltinReflectingJvmDescriptor() if (overriddenSpecialBuiltinFunction != null && !superCall) { - return mapSignatureSkipGeneric(context.referenceSimpleFunction(overriddenSpecialBuiltinFunction.original).owner) + return mapSignatureSkipGeneric(context.referenceFunction(overriddenSpecialBuiltinFunction.original).owner) } return null 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 68a6683ccd7..93528b0f507 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 @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.backend.jvm.codegen.isInlineIrExpression import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.irArray import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter -import org.jetbrains.kotlin.codegen.PropertyReferenceCodegen import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrStatement @@ -35,8 +34,8 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid -import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.utils.addIfNotNull internal val callableReferencePhase = makeIrFilePhase( @@ -348,10 +347,14 @@ internal class CallableReferenceLowering(private val context: JvmBackendContext) get() = (metadata as? MetadataSource.Function)?.descriptor?.name ?: name private fun createGetSignatureMethod(superFunction: IrSimpleFunction): IrSimpleFunction = buildOverride(superFunction).apply { - val state = context.state + val codegenContext = context body = context.createIrBuilder(symbol, startOffset, endOffset).run { // TODO do not use descriptors - irExprBody(irString(PropertyReferenceCodegen.getSignatureString(irFunctionReference.symbol.descriptor, state))) + val declaration = codegenContext.referenceFunction( + DescriptorUtils.unwrapFakeOverride(irFunctionReference.symbol.descriptor).original + ).owner + val method = codegenContext.methodSignatureMapper.mapAsmMethod(declaration) + irExprBody(irString(method.name + method.descriptor)) } }