diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5cd73fa8c92..aa5676800ca 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -402,6 +402,9 @@ public class ExpressionCodegen extends JetVisitor { if (type == PsiType.LONG) { return Type.LONG_TYPE; } + if (type == PsiType.BOOLEAN) { + return Type.BOOLEAN_TYPE; + } } if (type instanceof PsiClassType) { PsiClass psiClass = ((PsiClassType) type).resolve(); diff --git a/idea/src/org/jetbrains/jet/codegen/StackValue.java b/idea/src/org/jetbrains/jet/codegen/StackValue.java index 4904361bea2..3b46c0cc826 100644 --- a/idea/src/org/jetbrains/jet/codegen/StackValue.java +++ b/idea/src/org/jetbrains/jet/codegen/StackValue.java @@ -73,7 +73,17 @@ public abstract class StackValue { @Override public void condJump(Label label, boolean jumpIfFalse, InstructionAdapter v) { - throw new UnsupportedOperationException("don't know how to generate this condjump"); + if (type == Type.BOOLEAN_TYPE) { + if (jumpIfFalse) { + v.ifeq(label); + } + else { + v.ifne(label); + } + } + else { + throw new UnsupportedOperationException("can't generate a cond jump for a non-boolean value on stack"); + } } } diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 23623105f5a..1dca114e81b 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -181,13 +181,15 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { } 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); + final String code = "fun foo(a: Int, b: Int): Int = if (a != b) 1 else 0"; + binOpTest(code, 5, 5, 0); + binOpTest(code, 5, 3, 1); } public void testGE() throws Exception { - binOpTest("fun foo(a: Int, b: Int): Int = if (a >= b) 1 else 0", 5, 5, 1); - binOpTest("fun foo(a: Int, b: Int): Int = if (a >= b) 1 else 0", 3, 5, 0); + final String code = "fun foo(a: Int, b: Int): Int = if (a >= b) 1 else 0"; + binOpTest(code, 5, 5, 1); + binOpTest(code, 3, 5, 0); } public void testIfNoElse() throws Exception { @@ -198,6 +200,13 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase { assertEquals(10, main.invoke(null, 5, false)); } + public void testCondJumpOnStack() throws Exception { + loadText("fun foo(a: String): Int = if (Boolean.parseBoolean(a)) 5 else 10"); + final Method main = generateFunction(); + assertEquals(5, main.invoke(null, "true")); + assertEquals(10, main.invoke(null, "false")); + } + private void binOpTest(final String text, final int arg1, final int arg2, final int expected) throws Exception { loadText(text); System.out.println(generateToText());