KT-513 Proper use of resolved call in case of infix calls
This commit is contained in:
@@ -1111,7 +1111,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
|
|
||||||
private StackValue returnValueAsStackValue(FunctionDescriptor fd, Type callReturnType) {
|
private StackValue returnValueAsStackValue(FunctionDescriptor fd, Type callReturnType) {
|
||||||
if (callReturnType != Type.VOID_TYPE) {
|
if (callReturnType != Type.VOID_TYPE) {
|
||||||
final Type retType = typeMapper.mapType(fd.getReturnType());
|
final Type retType = typeMapper.mapReturnType(fd.getReturnType());
|
||||||
StackValue.onStack(callReturnType).upcast(retType, v);
|
StackValue.onStack(callReturnType).upcast(retType, v);
|
||||||
return StackValue.onStack(retType);
|
return StackValue.onStack(retType);
|
||||||
}
|
}
|
||||||
@@ -1163,6 +1163,17 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
|
ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
|
||||||
assert resolvedCall != null;
|
assert resolvedCall != null;
|
||||||
|
|
||||||
|
genThisAndReceiverFromResolvedCall(callableMethod, receiver, resolvedCall);
|
||||||
|
|
||||||
|
pushTypeArguments(resolvedCall);
|
||||||
|
int mask = pushMethodArguments(expression, callableMethod.getValueParameterTypes());
|
||||||
|
if(mask == 0)
|
||||||
|
callableMethod.invoke(v);
|
||||||
|
else
|
||||||
|
callableMethod.invokeWithDefault(v, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void genThisAndReceiverFromResolvedCall(CallableMethod callableMethod, StackValue receiver, ResolvedCall<? extends CallableDescriptor> resolvedCall) {
|
||||||
if (callableMethod.isNeedsThis()) {
|
if (callableMethod.isNeedsThis()) {
|
||||||
if(callableMethod.isNeedsReceiver()) {
|
if(callableMethod.isNeedsReceiver()) {
|
||||||
generateFromResolvedCall(resolvedCall.getThisObject());
|
generateFromResolvedCall(resolvedCall.getThisObject());
|
||||||
@@ -1191,13 +1202,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
receiver.put(callableMethod.getSignature().getArgumentTypes()[0], v);
|
receiver.put(callableMethod.getSignature().getArgumentTypes()[0], v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pushTypeArguments(resolvedCall);
|
|
||||||
int mask = pushMethodArguments(expression, callableMethod.getValueParameterTypes());
|
|
||||||
if(mask == 0)
|
|
||||||
callableMethod.invoke(v);
|
|
||||||
else
|
|
||||||
callableMethod.invokeWithDefault(v, mask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void generateFromResolvedCall(ReceiverDescriptor descriptor) {
|
protected void generateFromResolvedCall(ReceiverDescriptor descriptor) {
|
||||||
@@ -1470,9 +1474,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
Arrays.asList(expression.getLeft(), expression.getRight()), receiver);
|
Arrays.asList(expression.getLeft(), expression.getRight()), receiver);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
|
||||||
|
|
||||||
CallableMethod callableMethod = (CallableMethod) callable;
|
CallableMethod callableMethod = (CallableMethod) callable;
|
||||||
genToJVMStack(expression.getLeft());
|
genThisAndReceiverFromResolvedCall(callableMethod, StackValue.none(), resolvedCall);
|
||||||
genToJVMStack(expression.getRight());
|
pushTypeArguments(resolvedCall);
|
||||||
|
pushMethodArguments(resolvedCall, callableMethod.getValueParameterTypes());
|
||||||
callableMethod.invoke(v);
|
callableMethod.invoke(v);
|
||||||
return returnValueAsStackValue((FunctionDescriptor) op, callableMethod.getSignature().getReturnType());
|
return returnValueAsStackValue((FunctionDescriptor) op, callableMethod.getSignature().getReturnType());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class A() {
|
||||||
|
fun <T> ArrayList<T>.add3(el: T) = add(el)
|
||||||
|
|
||||||
|
fun test(list: ArrayList<Int>) {
|
||||||
|
for (i in 1..10) {
|
||||||
|
list add3 i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> ArrayList<T>.add2(el: T) = add(el)
|
||||||
|
|
||||||
|
fun box() : String{
|
||||||
|
var list = ArrayList<Int>()
|
||||||
|
for (i in 1..10) {
|
||||||
|
list add i
|
||||||
|
list add2 i
|
||||||
|
}
|
||||||
|
A().test(list)
|
||||||
|
System.out?.println(list)
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -212,4 +212,8 @@ public class ControlStructuresTest extends CodegenTestCase {
|
|||||||
blackBoxFile("regressions/kt416.jet");
|
blackBoxFile("regressions/kt416.jet");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt513() throws Exception {
|
||||||
|
blackBoxFile("regressions/kt513.jet");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user