correctly generate !=
This commit is contained in:
@@ -107,6 +107,9 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
gen(elseExpression, asmType);
|
gen(elseExpression, asmType);
|
||||||
|
|
||||||
v.mark(endLabel);
|
v.mark(endLabel);
|
||||||
|
if (asmType != Type.VOID_TYPE) {
|
||||||
|
myStack.push(StackValue.onStack(asmType));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -141,7 +144,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
gen(expression.getBody(), Type.VOID_TYPE);
|
gen(expression.getBody(), Type.VOID_TYPE);
|
||||||
|
|
||||||
gen(expression.getCondition());
|
gen(expression.getCondition());
|
||||||
myStack.pop().condJump(condition, true, v);
|
myStack.pop().condJump(condition, false, v);
|
||||||
|
|
||||||
v.mark(end);
|
v.mark(end);
|
||||||
|
|
||||||
@@ -477,7 +480,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
if (leftType == Type.INT_TYPE && rightType == Type.INT_TYPE) {
|
if (leftType == Type.INT_TYPE && rightType == Type.INT_TYPE) {
|
||||||
gen(expression.getLeft(), Type.INT_TYPE);
|
gen(expression.getLeft(), Type.INT_TYPE);
|
||||||
gen(expression.getRight(), Type.INT_TYPE);
|
gen(expression.getRight(), Type.INT_TYPE);
|
||||||
myStack.push(StackValue.icmp(JetTokens.EQEQ));
|
myStack.push(StackValue.icmp(opToken));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public abstract class StackValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static StackValue onStack(Type type) {
|
public static StackValue onStack(Type type) {
|
||||||
|
assert type != Type.VOID_TYPE;
|
||||||
return new OnStack(type);
|
return new OnStack(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,6 +132,9 @@ public abstract class StackValue {
|
|||||||
if (opToken == JetTokens.EQEQ) {
|
if (opToken == JetTokens.EQEQ) {
|
||||||
opcode = jumpIfFalse ? Opcodes.IF_ICMPNE : Opcodes.IF_ICMPEQ;
|
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) {
|
else if (opToken == JetTokens.GT) {
|
||||||
opcode = jumpIfFalse ? Opcodes.IF_ICMPLE : Opcodes.IF_ICMPGT;
|
opcode = jumpIfFalse ? Opcodes.IF_ICMPLE : Opcodes.IF_ICMPGT;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,6 +180,11 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
|
|||||||
binOpTest("fun foo(a: Int, b: Int): Int = a % b", 14, 3, 2);
|
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 {
|
public void testIfNoElse() throws Exception {
|
||||||
loadFile("ifNoElse.jet");
|
loadFile("ifNoElse.jet");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
|
|||||||
Reference in New Issue
Block a user