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 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 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);
|
FunctionDescriptor accessibleFunctionDescriptor = accessibleFunctionDescriptor(fd);
|
||||||
Callable callable = resolveToCallable(accessibleFunctionDescriptor, superCall, resolvedCall);
|
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
|
@Nullable
|
||||||
@@ -3255,7 +3254,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
|
|
||||||
//invokeMethodWithArguments(callable, resolvedCall, receiver);
|
//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) {
|
if (keepReturnValue) {
|
||||||
value.store(StackValue.onStack(callable.getReturnType()), v, true);
|
value.store(StackValue.onStack(callable.getReturnType()), v, true);
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class Concat : IntrinsicMethod() {
|
|||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
return object : IntrinsicCallable(method) {
|
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) {
|
return StackValue.operation(returnType) {
|
||||||
val arguments = resolvedCall.getCall().getValueArguments().map { it.getArgumentExpression() }
|
val arguments = resolvedCall.getCall().getValueArguments().map { it.getArgumentExpression() }
|
||||||
val actualType = generateImpl(
|
val actualType = generateImpl(
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class IdentityEquals : IntrinsicMethod() {
|
|||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
return object : IntrinsicCallable(method) {
|
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 element = resolvedCall.getCall().getCallElement()
|
||||||
val left: StackValue
|
val left: StackValue
|
||||||
val right: StackValue
|
val right: StackValue
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.codegen.intrinsics
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
|
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.Callable
|
||||||
import org.jetbrains.kotlin.codegen.CallableMethod
|
import org.jetbrains.kotlin.codegen.CallableMethod
|
||||||
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
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 {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
val type = codegen.getState().getTypeMapper().mapReturnType(fd)
|
val type = AsmUtil.unboxType(method.returnType)
|
||||||
return object: IntrinsicCallable(type, listOf(), AsmTypes.OBJECT_TYPE, null) {
|
return object: IntrinsicCallable(type, listOf(), AsmTypes.OBJECT_TYPE, null) {
|
||||||
override fun invokeIntrinsic(v: InstructionAdapter) {
|
override fun invokeIntrinsic(v: InstructionAdapter) {
|
||||||
val name = getIteratorName(returnType)
|
val name = getIteratorName(returnType)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class Not : IntrinsicMethod() {
|
|||||||
|
|
||||||
override fun toCallable(method: CallableMethod): Callable {
|
override fun toCallable(method: CallableMethod): Callable {
|
||||||
return object : IntrinsicCallable(method) {
|
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 element = resolvedCall.getCall().getCallElement()
|
||||||
val stackValue =
|
val stackValue =
|
||||||
if (element is JetPrefixExpression) {
|
if (element is JetPrefixExpression) {
|
||||||
|
|||||||
@@ -181,6 +181,11 @@ public class JetTypeMapper {
|
|||||||
}
|
}
|
||||||
return Type.VOID_TYPE;
|
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 {
|
else {
|
||||||
return mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false);
|
return mapType(returnType, sw, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE, false);
|
||||||
}
|
}
|
||||||
@@ -700,14 +705,7 @@ public class JetTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sw.writeReturnType();
|
sw.writeReturnType();
|
||||||
if (forceBoxedReturnType(f)) {
|
mapReturnType(f, sw);
|
||||||
// TYPE_PARAMETER is a hack to automatically box the return type
|
|
||||||
//noinspection ConstantConditions
|
|
||||||
mapType(f.getReturnType(), sw, JetTypeMapperMode.TYPE_PARAMETER);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mapReturnType(f, sw);
|
|
||||||
}
|
|
||||||
sw.writeReturnTypeEnd();
|
sw.writeReturnTypeEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user