From 47c838e62bea558854ee1bfe43face8b9eb8a71c Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Sat, 4 Apr 2015 12:24:59 +0300 Subject: [PATCH] Move some callable method impl to trait --- .../org/jetbrains/kotlin/codegen/Callable.kt | 11 +++++- .../kotlin/codegen/CallableMethod.kt | 38 +++---------------- .../kotlin/codegen/ExpressionCodegen.java | 12 +----- .../codegen/intrinsics/IntrinsicCallable.kt | 13 +------ 4 files changed, 18 insertions(+), 56 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt index 55977a63d14..0dc7b2629c1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt @@ -46,8 +46,15 @@ public trait Callable { public fun isStaticCall(): Boolean - public fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) + public fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) { - public fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue + } + + public fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { + return StackValue.functionCall(returnType) { + codegen.invokeMethodWithArguments(this, resolvedCall, receiver) + StackValue.coerce(this.returnType, returnType, it) + } + } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CallableMethod.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CallableMethod.kt index ec7661463fb..a1223770960 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CallableMethod.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CallableMethod.kt @@ -40,33 +40,19 @@ import java.util.ArrayList; public class CallableMethod(override val owner: Type, private val defaultImplOwner: Type?, private val defaultImplParam: Type?, private val signature: JvmMethodSignature, private val invokeOpcode: Int, override val thisType: Type?, override val receiverType: Type?, override val generateCalleeType: Type?) : Callable { - public fun getValueParameters(): List { return signature.getValueParameters() } override val valueParameterTypes: List - get() { - val valueParameters = signature.getValueParameters() - val result = ArrayList(valueParameters.size()) - for (parameter in valueParameters) { - if (parameter.getKind() == JvmMethodParameterKind.VALUE) { - result.add(parameter.getAsmType()) - } - } - return result - } + get() = signature.getValueParameters().filter { it.getKind() == JvmMethodParameterKind.VALUE }.map { it.getAsmType() } public fun getAsmMethod(): Method { return signature.getAsmMethod() } override val argumentTypes: Array - get() =signature.getAsmMethod().getArgumentTypes() - - private fun invoke(v: InstructionAdapter) { - v.visitMethodInsn(invokeOpcode, owner.getInternalName(), getAsmMethod().getName(), getAsmMethod().getDescriptor()) - } + get() = getAsmMethod().getArgumentTypes() public override fun invokeWithNotNullAssertion(v: InstructionAdapter, state: GenerationState, resolvedCall: ResolvedCall<*>) { @@ -75,7 +61,7 @@ public class CallableMethod(override val owner: Type, private val defaultImplOwn } public override fun invokeWithoutAssertions(v: InstructionAdapter) { - invoke(v) + v.visitMethodInsn(invokeOpcode, owner.getInternalName(), getAsmMethod().getName(), getAsmMethod().getDescriptor()) } private fun invokeDefault(v: InstructionAdapter) { @@ -104,25 +90,13 @@ public class CallableMethod(override val owner: Type, private val defaultImplOwn } override val returnType: Type - get() { - return signature.getReturnType() - } - - override fun toString(): String { - return Printer.OPCODES[invokeOpcode] + " " + owner.getInternalName() + "." + signature - } + get() = signature.getReturnType() override fun isStaticCall(): Boolean { return invokeOpcode == INVOKESTATIC } - public override fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) { - - } - - override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { - return StackValue.functionCall(returnType) { - codegen.invokeMethodWithArguments(this@CallableMethod, resolvedCall, receiver, returnType) - } + override fun toString(): String { + return "${Printer.OPCODES[invokeOpcode]} ${owner.getInternalName()}.$signature" } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 844430a9441..e502e65a8a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2255,17 +2255,7 @@ public class ExpressionCodegen extends JetVisitor implem Callable callable = resolveToCallable(accessibleFunctionDescriptor, superCall, resolvedCall); Type returnType = typeMapper.mapReturnType(accessibleFunctionDescriptor); - return ((Callable) callable).invokeMethodWithArguments(resolvedCall, receiver, returnType, this); - } - - public void invokeMethodWithArguments( - @NotNull Callable callable, - @NotNull ResolvedCall resolvedCall, - @NotNull StackValue receiver, - @NotNull Type returnType - ) { - invokeMethodWithArguments(callable, resolvedCall, receiver); - StackValue.coerce(callable.getReturnType(), returnType, v); + return callable.invokeMethodWithArguments(resolvedCall, receiver, returnType, this); } @Nullable diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicCallable.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicCallable.kt index c643c51c87d..ef823091f0b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicCallable.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicCallable.kt @@ -97,26 +97,17 @@ public abstract class IntrinsicCallable(override val returnType: Type, return receiverType ?: thisType } - override fun beforeParameterGeneration(v: InstructionAdapter, value: StackValue?) { - - } - - override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { - return StackValue.functionCall(returnType) { - codegen.invokeMethodWithArguments(this, resolvedCall, receiver, returnType) - } - } } public class UnaryIntrinsic(val callable: CallableMethod, val newReturnType: Type? = null, needPrimitiveCheck: Boolean = false, val newThisType: Type? = null, val invoke: UnaryIntrinsic.(v: InstructionAdapter) -> Unit) : IntrinsicCallable(newReturnType ?: callable.returnType, callable.valueParameterTypes, newThisType ?: callable.thisType, callable.receiverType) { - { + init { if (needPrimitiveCheck) { assert(AsmUtil.isPrimitive(returnType)) { "Return type of UnaryPlus intrinsic should be of primitive type : " + returnType } } - assert(valueParameterTypes.size == 0, "Unary operation should not have any parameters") + assert(valueParameterTypes.isEmpty(), "Unary operation should not have any parameters") } override fun invokeIntrinsic(v: InstructionAdapter) {