Simpler byte code generated for comparison with null and zero.
Analogous byte code is generated by Javac.
This commit is contained in:
@@ -2849,34 +2849,46 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
private StackValue genCmpWithZero(JetExpression exp, Type expType, IElementType opToken) {
|
private StackValue genCmpWithZero(JetExpression exp, Type expType, IElementType opToken) {
|
||||||
v.iconst(1);
|
|
||||||
gen(exp, expType);
|
gen(exp, expType);
|
||||||
Label ok = new Label();
|
Label trueLabel = new Label();
|
||||||
|
Label afterLabel = new Label();
|
||||||
if (JetTokens.EQEQ == opToken || JetTokens.EQEQEQ == opToken) {
|
if (JetTokens.EQEQ == opToken || JetTokens.EQEQEQ == opToken) {
|
||||||
v.ifeq(ok);
|
v.ifeq(trueLabel);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
v.ifne(ok);
|
v.ifne(trueLabel);
|
||||||
}
|
}
|
||||||
v.pop();
|
|
||||||
v.iconst(0);
|
v.iconst(0);
|
||||||
v.mark(ok);
|
v.goTo(afterLabel);
|
||||||
|
|
||||||
|
v.mark(trueLabel);
|
||||||
|
v.iconst(1);
|
||||||
|
|
||||||
|
v.mark(afterLabel);
|
||||||
|
|
||||||
return StackValue.onStack(Type.BOOLEAN_TYPE);
|
return StackValue.onStack(Type.BOOLEAN_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private StackValue genCmpWithNull(JetExpression exp, Type expType, IElementType opToken) {
|
private StackValue genCmpWithNull(JetExpression exp, Type expType, IElementType opToken) {
|
||||||
v.iconst(1);
|
|
||||||
gen(exp, boxType(expType));
|
gen(exp, boxType(expType));
|
||||||
Label ok = new Label();
|
Label trueLabel = new Label();
|
||||||
|
Label afterLabel = new Label();
|
||||||
if (JetTokens.EQEQ == opToken || JetTokens.EQEQEQ == opToken) {
|
if (JetTokens.EQEQ == opToken || JetTokens.EQEQEQ == opToken) {
|
||||||
v.ifnull(ok);
|
v.ifnull(trueLabel);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
v.ifnonnull(ok);
|
v.ifnonnull(trueLabel);
|
||||||
}
|
}
|
||||||
v.pop();
|
|
||||||
v.iconst(0);
|
v.iconst(0);
|
||||||
v.mark(ok);
|
v.goTo(afterLabel);
|
||||||
|
|
||||||
|
v.mark(trueLabel);
|
||||||
|
v.iconst(1);
|
||||||
|
|
||||||
|
v.mark(afterLabel);
|
||||||
|
|
||||||
return StackValue.onStack(Type.BOOLEAN_TYPE);
|
return StackValue.onStack(Type.BOOLEAN_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user