diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt index 2642240360b..cd114816bb2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/Callable.kt @@ -46,15 +46,14 @@ public trait Callable { public fun isStaticCall(): Boolean + public fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, codegen: ExpressionCodegen): StackValue { + return StackValue.functionCall(returnType) { + codegen.invokeMethodWithArguments(this, resolvedCall, receiver) + } + } + public fun beforeParameterGeneration(v: InstructionAdapter, value: 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/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 88c704db0f6..7d967cceb94 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2249,9 +2249,8 @@ public class ExpressionCodegen extends JetVisitor implem FunctionDescriptor accessibleFunctionDescriptor = accessibleFunctionDescriptor(fd); Callable callable = resolveToCallable(accessibleFunctionDescriptor, superCall, resolvedCall); - Type returnType = typeMapper.mapReturnType(accessibleFunctionDescriptor); - return callable.invokeMethodWithArguments(resolvedCall, receiver, returnType, this); + return callable.invokeMethodWithArguments(resolvedCall, receiver, this); } @Nullable @@ -3255,7 +3254,7 @@ public class ExpressionCodegen extends JetVisitor implem //invokeMethodWithArguments(callable, resolvedCall, receiver); - callable.invokeMethodWithArguments(resolvedCall, receiver, callable.getReturnType(), this).put(callable.getReturnType(), v); + callable.invokeMethodWithArguments(resolvedCall, receiver, this).put(callable.getReturnType(), v); if (keepReturnValue) { value.store(StackValue.onStack(callable.getReturnType()), v, true); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt index 3a423d440b2..2c71fa662cb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt @@ -58,7 +58,7 @@ public class Concat : IntrinsicMethod() { override fun toCallable(method: CallableMethod): Callable { return object : IntrinsicCallable(method) { - override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { + override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, codegen: ExpressionCodegen): StackValue { return StackValue.operation(returnType) { val arguments = resolvedCall.getCall().getValueArguments().map { it.getArgumentExpression() } val actualType = generateImpl( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IdentityEquals.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IdentityEquals.kt index 1ce2c65d6bd..48ced009b73 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IdentityEquals.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IdentityEquals.kt @@ -33,7 +33,7 @@ public class IdentityEquals : IntrinsicMethod() { override fun toCallable(method: CallableMethod): Callable { return object : IntrinsicCallable(method) { - override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { + override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, codegen: ExpressionCodegen): StackValue { val element = resolvedCall.getCall().getCallElement() val left: StackValue val right: StackValue diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IteratorNext.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IteratorNext.kt index 71410346347..ff42c7ea362 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IteratorNext.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IteratorNext.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.codegen.intrinsics import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME +import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.Callable import org.jetbrains.kotlin.codegen.CallableMethod import org.jetbrains.kotlin.codegen.ExpressionCodegen @@ -45,8 +46,8 @@ public class IteratorNext : IntrinsicMethod() { } - override fun toCallable(fd: FunctionDescriptor, isSuper: Boolean, resolvedCall: ResolvedCall<*>, codegen: ExpressionCodegen): Callable { - val type = codegen.getState().getTypeMapper().mapReturnType(fd) + override fun toCallable(method: CallableMethod): Callable { + val type = AsmUtil.unboxType(method.returnType) return object: IntrinsicCallable(type, listOf(), AsmTypes.OBJECT_TYPE, null) { override fun invokeIntrinsic(v: InstructionAdapter) { val name = getIteratorName(returnType) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Not.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Not.kt index 6b59d232a46..b72a508cb3c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Not.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Not.kt @@ -41,7 +41,7 @@ public class Not : IntrinsicMethod() { override fun toCallable(method: CallableMethod): Callable { return object : IntrinsicCallable(method) { - override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, returnType: Type, codegen: ExpressionCodegen): StackValue { + override fun invokeMethodWithArguments(resolvedCall: ResolvedCall<*>, receiver: StackValue, codegen: ExpressionCodegen): StackValue { val element = resolvedCall.getCall().getCallElement() val stackValue = if (element is JetPrefixExpression) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 07afc242271..145964e5d65 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -181,6 +181,11 @@ public class JetTypeMapper { } return Type.VOID_TYPE; } + else if (descriptor instanceof FunctionDescriptor && forceBoxedReturnType((FunctionDescriptor) descriptor)) { + // TYPE_PARAMETER is a hack to automatically box the return type + //noinspection ConstantConditions + return mapType(descriptor.getReturnType(), sw, JetTypeMapperMode.TYPE_PARAMETER); + } else { return mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false); } @@ -700,14 +705,7 @@ public class JetTypeMapper { } sw.writeReturnType(); - if (forceBoxedReturnType(f)) { - // TYPE_PARAMETER is a hack to automatically box the return type - //noinspection ConstantConditions - mapType(f.getReturnType(), sw, JetTypeMapperMode.TYPE_PARAMETER); - } - else { - mapReturnType(f, sw); - } + mapReturnType(f, sw); sw.writeReturnTypeEnd(); }