diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 0a7e35748fb..ce04ffe872c 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -506,12 +506,13 @@ public class ExpressionCodegen extends JetVisitor { private static boolean isNumberPrimitive(String className) { return className.equals("Int") || className.equals("Long") || className.equals("Short") || - className.equals("Byte") || className.equals("Char") || className.equals("Float"); + className.equals("Byte") || className.equals("Char") || className.equals("Float") || + className.equals("Double"); } private static boolean isNumberPrimitive(Type type) { return type == Type.INT_TYPE || type == Type.SHORT_TYPE || type == Type.BYTE_TYPE || type == Type.CHAR_TYPE || - type == Type.FLOAT_TYPE; + type == Type.FLOAT_TYPE || type == Type.DOUBLE_TYPE; } private static int opcodeForMethod(final String name) { @@ -526,7 +527,8 @@ public class ExpressionCodegen extends JetVisitor { private void generateBinaryOp(JetBinaryExpression expression, FunctionDescriptor op, int opcode) { JetType returnType = op.getUnsubstitutedReturnType(); final Type asmType = typeMapper.mapType(returnType); - if (asmType == Type.INT_TYPE || asmType == Type.LONG_TYPE || asmType == Type.FLOAT_TYPE) { + if (asmType == Type.INT_TYPE || asmType == Type.LONG_TYPE || + asmType == Type.FLOAT_TYPE || asmType == Type.DOUBLE_TYPE) { gen(expression.getLeft(), asmType); gen(expression.getRight(), asmType); v.visitInsn(asmType.getOpcode(opcode)); diff --git a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 36970231c95..7cde8791f9d 100644 --- a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -35,6 +35,9 @@ public class JetTypeMapper { if (jetType.equals(standardLibrary.getFloatType())) { return Type.FLOAT_TYPE; } + if (jetType.equals(standardLibrary.getDoubleType())) { + return Type.DOUBLE_TYPE; + } if (jetType.equals(standardLibrary.getBooleanType())) { return Type.BOOLEAN_TYPE; } diff --git a/idea/src/org/jetbrains/jet/codegen/StackValue.java b/idea/src/org/jetbrains/jet/codegen/StackValue.java index e103d16bb1e..4cb972aa873 100644 --- a/idea/src/org/jetbrains/jet/codegen/StackValue.java +++ b/idea/src/org/jetbrains/jet/codegen/StackValue.java @@ -158,7 +158,7 @@ public abstract class StackValue { else { throw new UnsupportedOperationException("don't know how to generate this condjump"); } - if (type == Type.FLOAT_TYPE) { + if (type == Type.FLOAT_TYPE || type == Type.DOUBLE_TYPE) { if (opToken == JetTokens.GT || opToken == JetTokens.GTEQ) { v.cmpg(type); } diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index c046b82d067..3cb21f12249 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -287,6 +287,14 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { binOpTest("fun foo(a: Float, b: Float): Boolean = a == b", 1.0f, 1.0f, true); } + public void testDouble() throws Exception { + binOpTest("fun foo(a: Double, b: Double): Double = a + b", 1.0, 2.0, 3.0); + } + + public void testDoubleCmp() throws Exception { + binOpTest("fun foo(a: Double, b: Double): Boolean = a == b", 1.0, 2.0, false); + } + private void binOpTest(final String text, final Object arg1, final Object arg2, final Object expected) throws Exception { loadText(text); System.out.println(generateToText());