Fix elvis expression in case of nullable generic

This commit is contained in:
Alexander Udalov
2013-02-06 16:37:06 +04:00
parent 8697adb28a
commit 70f67c7993
4 changed files with 53 additions and 21 deletions
@@ -2456,27 +2456,26 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
private StackValue generateElvis(JetBinaryExpression expression) {
final Type exprType = expressionType(expression);
JetType type = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression.getLeft());
assert type != null;
final Type leftType = asmType(type);
if (type.isNullable()) {
gen(expression.getLeft(), leftType);
v.dup();
Label end = new Label();
Label ifNull = new Label();
v.ifnull(ifNull);
StackValue.onStack(leftType).put(exprType, v);
v.goTo(end);
v.mark(ifNull);
v.pop();
gen(expression.getRight(), exprType);
v.mark(end);
}
else {
gen(expression.getLeft(), leftType);
StackValue.onStack(leftType).put(exprType, v);
Type exprType = expressionType(expression);
Type leftType = expressionType(expression.getLeft());
gen(expression.getLeft(), leftType);
if (isPrimitive(leftType)) {
return StackValue.onStack(leftType);
}
v.dup();
Label ifNull = new Label();
v.ifnull(ifNull);
StackValue.onStack(leftType).put(exprType, v);
Label end = new Label();
v.goTo(end);
v.mark(ifNull);
v.pop();
gen(expression.getRight(), exprType);
v.mark(end);
return StackValue.onStack(exprType);
}