KT-513 Proper use of resolved call in case of infix calls

This commit is contained in:
Alex Tkachman
2011-11-15 16:52:35 +02:00
parent 6c3294ca3a
commit 84593f2cfb
3 changed files with 45 additions and 10 deletions
@@ -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");
}
} }