diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 2054c35adc9..5cd73fa8c92 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -107,6 +107,9 @@ public class ExpressionCodegen extends JetVisitor { gen(elseExpression, asmType); v.mark(endLabel); + if (asmType != Type.VOID_TYPE) { + myStack.push(StackValue.onStack(asmType)); + } } @Override @@ -141,7 +144,7 @@ public class ExpressionCodegen extends JetVisitor { gen(expression.getBody(), Type.VOID_TYPE); gen(expression.getCondition()); - myStack.pop().condJump(condition, true, v); + myStack.pop().condJump(condition, false, v); v.mark(end); @@ -477,7 +480,7 @@ public class ExpressionCodegen extends JetVisitor { if (leftType == Type.INT_TYPE && rightType == Type.INT_TYPE) { gen(expression.getLeft(), Type.INT_TYPE); gen(expression.getRight(), Type.INT_TYPE); - myStack.push(StackValue.icmp(JetTokens.EQEQ)); + myStack.push(StackValue.icmp(opToken)); return; } else { diff --git a/idea/src/org/jetbrains/jet/codegen/StackValue.java b/idea/src/org/jetbrains/jet/codegen/StackValue.java index ceafe2c8f4f..060829e5d5e 100644 --- a/idea/src/org/jetbrains/jet/codegen/StackValue.java +++ b/idea/src/org/jetbrains/jet/codegen/StackValue.java @@ -19,6 +19,7 @@ public abstract class StackValue { } public static StackValue onStack(Type type) { + assert type != Type.VOID_TYPE; return new OnStack(type); } @@ -131,6 +132,9 @@ public abstract class StackValue { if (opToken == JetTokens.EQEQ) { opcode = jumpIfFalse ? Opcodes.IF_ICMPNE : Opcodes.IF_ICMPEQ; } + else if (opToken == JetTokens.EXCLEQ) { + opcode = jumpIfFalse ? Opcodes.IF_ICMPEQ : Opcodes.IF_ICMPNE; + } else if (opToken == JetTokens.GT) { opcode = jumpIfFalse ? Opcodes.IF_ICMPLE : Opcodes.IF_ICMPGT; } diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index cb9d467b104..2ffd355a96d 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -180,6 +180,11 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { binOpTest("fun foo(a: Int, b: Int): Int = a % b", 14, 3, 2); } + public void testNE() throws Exception { + binOpTest("fun foo(a: Int, b: Int): Int = if (a != b) 1 else 0", 5, 5, 0); + binOpTest("fun foo(a: Int, b: Int): Int = if (a != b) 1 else 0", 5, 3, 1); + } + public void testIfNoElse() throws Exception { loadFile("ifNoElse.jet"); System.out.println(generateToText());