Use callableMethod return type as function call result type
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user