From f0d09288a8675ee6ee0d57d17c52fd3ca6601136 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 6 Oct 2016 13:55:30 +0300 Subject: [PATCH] Initial KCallableNameProperty support --- .../jvm/intrinsics/IrIntrinsicMethods.kt | 6 +++-- .../jvm/intrinsics/KCallableNameProperty.kt | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt index 0c51c712535..0c33502c5c2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.resolve.DescriptorUtils class IrIntrinsicMethods(irBuiltIns: IrBuiltIns) { @@ -42,8 +43,9 @@ class IrIntrinsicMethods(irBuiltIns: IrBuiltIns) { fun getIntrinsic(descriptor: CallableMemberDescriptor): IntrinsicMethod? { return intrinsics.getIntrinsic(descriptor) ?: - (if (descriptor is PropertyAccessorDescriptor) intrinsics.getIntrinsic(descriptor.correspondingProperty) else null) ?: - irMapping[descriptor.original] + (if (descriptor is PropertyAccessorDescriptor) + intrinsics.getIntrinsic(DescriptorUtils.unwrapFakeOverride(descriptor.correspondingProperty)) + else null) ?: irMapping[descriptor.original] } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/KCallableNameProperty.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/KCallableNameProperty.kt index 900597f4ba3..1fbb7c6ff25 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/KCallableNameProperty.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/KCallableNameProperty.kt @@ -16,19 +16,43 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics +import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.expressions.IrCallableReference +import org.jetbrains.kotlin.ir.expressions.IrClassReference +import org.jetbrains.kotlin.ir.expressions.IrGetClass +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_STRING_TYPE +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type.VOID_TYPE +import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class KCallableNameProperty : IntrinsicMethod() { + + override fun toCallable(expression: IrMemberAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction { + return object: IrIntrinsicFunction(expression, signature, context) { + override fun invoke(v: InstructionAdapter, codegen: org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen, data: BlockInfo): StackValue { + val callableReference = expression.dispatchReceiver as IrCallableReference + /*TODO optimize generation*/ + + codegen.gen(callableReference.dispatchReceiver ?: callableReference.extensionReceiver!!, VOID_TYPE, data) + codegen.mv.aconst(callableReference.descriptor.name.asString()) + StackValue.coerce(JAVA_STRING_TYPE, returnType, codegen.mv) + return StackValue.onStack(signature.returnType) + } + } + } + fun generate(resolvedCall: ResolvedCall<*>?, codegen: ExpressionCodegen, returnType: Type, receiver: StackValue): StackValue? { val expressionReceiver = resolvedCall!!.dispatchReceiver as? ExpressionReceiver ?: return null val expression = expressionReceiver.expression as? KtCallableReferenceExpression ?: return null