From 84593f2cfbcb5efa36f80062703da731f487c285 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 15 Nov 2011 16:52:35 +0200 Subject: [PATCH] KT-513 Proper use of resolved call in case of infix calls --- .../jet/codegen/ExpressionCodegen.java | 27 ++++++++++++------- .../testData/codegen/regressions/kt513.jet | 24 +++++++++++++++++ .../jet/codegen/ControlStructuresTest.java | 4 +++ 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt513.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 523f8f55a58..7df7980364e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1111,7 +1111,7 @@ public class ExpressionCodegen extends JetVisitor { 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 { ResolvedCall 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 resolvedCall) { if (callableMethod.isNeedsThis()) { if(callableMethod.isNeedsReceiver()) { generateFromResolvedCall(resolvedCall.getThisObject()); @@ -1191,13 +1202,6 @@ public class ExpressionCodegen extends JetVisitor { 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 { Arrays.asList(expression.getLeft(), expression.getRight()), receiver); } else { + ResolvedCall 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()); } diff --git a/compiler/testData/codegen/regressions/kt513.jet b/compiler/testData/codegen/regressions/kt513.jet new file mode 100644 index 00000000000..d6aef72365d --- /dev/null +++ b/compiler/testData/codegen/regressions/kt513.jet @@ -0,0 +1,24 @@ +import java.util.* + +class A() { + fun ArrayList.add3(el: T) = add(el) + + fun test(list: ArrayList) { + for (i in 1..10) { + list add3 i + } + } +} + +fun ArrayList.add2(el: T) = add(el) + +fun box() : String{ + var list = ArrayList() + for (i in 1..10) { + list add i + list add2 i + } + A().test(list) + System.out?.println(list) + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index d3748a7b737..f8abdb701b2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -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"); + } }