Use callableMethod return type as function call result type

This commit is contained in:
Michael Bogdanov
2015-04-06 20:04:09 +03:00
parent 86e12f1f42
commit f551e90d7c
7 changed files with 20 additions and 23 deletions
@@ -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)
}
}
}
@@ -2249,9 +2249,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> 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<StackValue, StackValue> 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);
@@ -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(
@@ -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
@@ -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)
@@ -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) {
@@ -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();
}