From f13da41f4348730e095acc65bcab37cc08482f96 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 15 Apr 2011 19:36:11 +0200 Subject: [PATCH] augmented assignments via StackValue.store() --- .../jet/codegen/ExpressionCodegen.java | 28 ++++++------------- .../jet/codegen/NamespaceGenTest.java | 10 +++++++ 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index f1906a2a0b5..b6644d44924 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -785,27 +785,15 @@ public class ExpressionCodegen extends JetVisitor { } private void generateAugmentedAssignment(JetBinaryExpression expression) { + DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference()); final JetExpression lhs = expression.getLeft(); - if (lhs instanceof JetReferenceExpression) { - DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference()); - final JetType leftType = bindingContext.getExpressionType(lhs); - final Type asmType = typeMapper.mapType(leftType); - if (isNumberPrimitive(asmType)) { - final int index = indexOfLocal((JetReferenceExpression) lhs); - assert index >= 0; - v.load(index, asmType); - gen(expression.getRight(), asmType); - int opcode = opcodeForMethod(op.getName()); - v.visitInsn(asmType.getOpcode(opcode)); - v.store(index, asmType); - } - else { - throw new UnsupportedOperationException("Don't know how to generate augmented assignment for non-numeric types"); - } - } - else { - throw new UnsupportedOperationException("Don't know how to generate augmented assignment to " + lhs.getText()); - } + Type asmType = expressionType(lhs); + StackValue value = generateIntermediateValue(lhs); + value.put(asmType, v); + genToJVMStack(expression.getRight()); + v.visitInsn(asmType.getOpcode(opcodeForMethod(op.getName()))); + value = generateIntermediateValue(lhs); + value.store(v, true); } private void generateConcatenation(JetBinaryExpression expression) { diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 3d3a38925c8..7804e64cf64 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -315,6 +315,16 @@ public class NamespaceGenTest extends CodegenTestCase { assertEquals(610, c.gridx); } + public void testFieldAugAssign() throws Exception { + loadText("import java.awt.*; fun foo(c: GridBagConstraints) { c.gridx *= 2; return; }"); + System.out.println(generateToText()); + final Method main = generateFunction(); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 305; + main.invoke(null, c); + assertEquals(610, c.gridx); + } + public void testIncrementAsLastOperation() throws Exception { loadText("fun foo() { var a = 0; a++; }"); generateFunction(); // make sure we're not falling off end of code