KT-13931 more compact inIntRange bytecode generation

This commit is contained in:
Vsevolod
2016-09-20 00:46:48 +03:00
committed by Dmitry Petrov
parent f95dcad179
commit 1f9b148a5d
@@ -3469,40 +3469,39 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
});
}
/*
* Translates x in a..b (for int and char ranges only)
* to a <= x && x >= b same way as javac 1.8.0_91 does.
*/
private void genInIntRange(StackValue leftValue, KtBinaryExpression rangeExpression) {
v.iconst(1);
// 1
leftValue.put(Type.INT_TYPE, v);
// 1 l
v.dup2();
// 1 l 1 l
//noinspection ConstantConditions
// Load left bound
gen(rangeExpression.getLeft(), Type.INT_TYPE);
// 1 l 1 l r
Label lok = new Label();
v.ificmpge(lok);
// 1 l 1
v.pop();
v.iconst(0);
v.mark(lok);
// 1 l c
v.dupX2();
// c 1 l c
v.pop();
// c 1 l
// Load argument
leftValue.put(Type.INT_TYPE, v);
// If (left > arg) goto L1 (return)
Label l1 = new Label();
v.ificmpgt(l1);
// Load argument again
leftValue.put(Type.INT_TYPE, v);
// Load right bound
gen(rangeExpression.getRight(), Type.INT_TYPE);
// c 1 l r
Label rok = new Label();
v.ificmple(rok);
// c 1
v.pop();
v.iconst(0);
v.mark(rok);
// c c
// If (x > right) goto L1 (return)
v.ificmpgt(l1);
v.and(Type.INT_TYPE);
Label l2 = new Label();
// Push 'true'
v.iconst(1);
// Goto return
v.goTo(l2);
// L1: push 'false'
v.mark(l1);
v.iconst(0);
// L2: implicit ireturn
v.mark(l2);
}
private StackValue generateBooleanAnd(KtBinaryExpression expression) {