From bf5a525748aff8eaeddb3cf2c04268bd1cffec33 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 14 Jul 2011 20:41:03 +0200 Subject: [PATCH] generate augmented assignment for number primitives via intrinsics --- .../jet/codegen/ExpressionCodegen.java | 26 +++---------------- .../jet/codegen/intrinsics/BinaryOp.java | 4 ++- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 021f4406352..50220726299 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1228,21 +1228,6 @@ public class ExpressionCodegen extends JetVisitor { return JetTypeMapper.isIntPrimitive(type) || type == Type.FLOAT_TYPE || type == Type.DOUBLE_TYPE || type == Type.LONG_TYPE; } - private static int opcodeForMethod(final String name) { - if (name.equals("plus")) return Opcodes.IADD; - if (name.equals("minus")) return Opcodes.ISUB; - if (name.equals("times")) return Opcodes.IMUL; - if (name.equals("div")) return Opcodes.IDIV; - if (name.equals("mod")) return Opcodes.IREM; - if (name.equals("shl")) return Opcodes.ISHL; - if (name.equals("shr")) return Opcodes.ISHR; - if (name.equals("ushr")) return Opcodes.IUSHR; - if (name.equals("and")) return Opcodes.IAND; - if (name.equals("or")) return Opcodes.IOR; - if (name.equals("xor")) return Opcodes.IXOR; - throw new UnsupportedOperationException("Don't know how to generate binary op method " + name); - } - private void generateCompareOp(JetExpression left, JetExpression right, IElementType opToken, Type operandType) { gen(left, operandType); gen(right, operandType); @@ -1270,19 +1255,16 @@ public class ExpressionCodegen extends JetVisitor { final JetExpression lhs = expression.getLeft(); Type lhsType = expressionType(lhs); if (bindingContext.isVariableReassignment(expression)) { - if (isNumberPrimitive(lhsType)) { + if (callable instanceof IntrinsicMethod) { StackValue value = generateIntermediateValue(lhs); // receiver value.dupReceiver(v, 0); // receiver receiver value.put(lhsType, v); // receiver lhs - genToJVMStack(expression.getRight()); // receiver lhs rhs - v.visitInsn(lhsType.getOpcode(opcodeForMethod(op.getName()))); // receiver result + final IntrinsicMethod intrinsic = (IntrinsicMethod) callable; + intrinsic.generate(this, v, lhsType, expression, Arrays.asList(lhs, expression.getRight()), true); value.store(v); } - else if (callable instanceof CallableMethod) { - callAugAssignMethod(expression, (CallableMethod) callable, lhsType, true); - } else { - throw new UnsupportedOperationException("Augmented assignment for non-primitive types not yet implemented"); + callAugAssignMethod(expression, (CallableMethod) callable, lhsType, true); } } else { diff --git a/idea/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java b/idea/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java index c592b99d351..08930c95cac 100644 --- a/idea/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java +++ b/idea/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java @@ -21,7 +21,9 @@ public class BinaryOp implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments, boolean haveReceiver) { - codegen.gen(arguments.get(0), expectedType); + if (!haveReceiver) { + codegen.gen(arguments.get(0), expectedType); + } codegen.gen(arguments.get(1), expectedType); v.visitInsn(expectedType.getOpcode(opcode)); return StackValue.onStack(expectedType);