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) {
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);
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());
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.isNeedsReceiver()) {
generateFromResolvedCall(resolvedCall.getThisObject());
@@ -1191,13 +1202,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
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) {
@@ -1470,9 +1474,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
Arrays.asList(expression.getLeft(), expression.getRight()), receiver);
}
else {
ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
CallableMethod callableMethod = (CallableMethod) callable;
genToJVMStack(expression.getLeft());
genToJVMStack(expression.getRight());
genThisAndReceiverFromResolvedCall(callableMethod, StackValue.none(), resolvedCall);
pushTypeArguments(resolvedCall);
pushMethodArguments(resolvedCall, callableMethod.getValueParameterTypes());
callableMethod.invoke(v);
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");
System.out.println(generateToText());
}
public void testKt513() throws Exception {
blackBoxFile("regressions/kt513.jet");
}
}