From c318191f5d4955539acbfe314235aa7373ce79d0 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 10 Jan 2012 21:14:22 +0200 Subject: [PATCH] KT-935 resolved call used on += --- .../jet/codegen/ExpressionCodegen.java | 13 +++++++- .../testData/codegen/regressions/kt935.kt | 30 +++++++++++++++++++ .../jet/codegen/PrimitiveTypesTest.java | 4 +++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/regressions/kt935.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index fbdec54b7f9..75f29f34539 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1864,12 +1864,23 @@ public class ExpressionCodegen extends JetVisitor { } private void callAugAssignMethod(JetBinaryExpression expression, CallableMethod callable, Type lhsType, final boolean keepReturnValue) { + ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); + assert resolvedCall != null; + StackValue value = gen(expression.getLeft()); if (keepReturnValue) { value.dupReceiver(v); } value.put(lhsType, v); - genToJVMStack(expression.getRight()); + StackValue receiver = StackValue.onStack(lhsType); + + if(!(resolvedCall.getResultingDescriptor() instanceof ConstructorDescriptor)) { // otherwise already + receiver = StackValue.receiver(resolvedCall, receiver, this, callable); + receiver.put(receiver.type, v); + } + + pushTypeArguments(resolvedCall); + pushMethodArguments(resolvedCall, callable.getValueParameterTypes()); callable.invoke(v); if (keepReturnValue) { value.store(v); diff --git a/compiler/testData/codegen/regressions/kt935.kt b/compiler/testData/codegen/regressions/kt935.kt new file mode 100644 index 00000000000..7b76c881cdf --- /dev/null +++ b/compiler/testData/codegen/regressions/kt935.kt @@ -0,0 +1,30 @@ +package bottles + +fun box() : String { + var bottles = 10 + while (bottles > 0) { + print(bottlesOfBeer(bottles) + " on the wall, ") + println(bottlesOfBeer(bottles) + ".") + print("Take one down, pass it around, ") + if (--bottles == 0) { + println("no more bottles of beer on the wall.") + } + else { + println(bottlesOfBeer(bottles) + " on the wall.") + } + } + return "OK" +} + +fun bottlesOfBeer(count : Int) : String { + val result = StringBuilder() + result += count + result += if (count > 1) " bottles of beer" else " bottle of beer" + return result.toString() ?: "" +} + +// An excerpt from the standard library +fun print(message : String) { System.out?.print(message) } +fun println(message : String) { System.out?.println(message) } +fun StringBuilder.plusAssign(o : Any) { append(o) } +val Array.isEmpty : Boolean get() = size == 0 \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 77eeccc0997..fc073e4bd1f 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -387,4 +387,8 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testKt945 () { blackBoxFile("regressions/kt945.jet"); } + + public void testKt935 () { + blackBoxFile("regressions/kt935.kt"); + } }