KT-944 iterations over empty ranges
This commit is contained in:
@@ -536,7 +536,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
gen(expression.getLoopRange(), loopRangeType);
|
gen(expression.getLoopRange(), loopRangeType);
|
||||||
v.dup();
|
v.dup();
|
||||||
|
|
||||||
v.invokevirtual("jet/IntRange", "getStart", "()I");
|
v.invokevirtual("jet/IntRange", "getIteratorStart", "()I");
|
||||||
v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE);
|
v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE);
|
||||||
v.invokevirtual("jet/IntRange", "getEnd", "()I");
|
v.invokevirtual("jet/IntRange", "getEnd", "()I");
|
||||||
v.store(myEndVar, Type.INT_TYPE);
|
v.store(myEndVar, Type.INT_TYPE);
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ class IntRange(val start : Int, val size : Int) : Range<Int>, IntIterable {
|
|||||||
|
|
||||||
val end : Int
|
val end : Int
|
||||||
|
|
||||||
|
val iteratorStart : Int
|
||||||
|
|
||||||
fun minus() : IntRange
|
fun minus() : IntRange
|
||||||
|
|
||||||
fun step(step: Int) : IntIterator
|
fun step(step: Int) : IntIterator
|
||||||
@@ -23,6 +25,8 @@ class LongRange(val start : Long, val size : Long) : Range<Long>, LongIterable {
|
|||||||
|
|
||||||
fun contains (elem: Long) : Boolean
|
fun contains (elem: Long) : Boolean
|
||||||
|
|
||||||
|
val iteratorStart : Long
|
||||||
|
|
||||||
val end : Long
|
val end : Long
|
||||||
|
|
||||||
fun minus() : LongRange
|
fun minus() : LongRange
|
||||||
@@ -39,6 +43,8 @@ class ByteRange(val start : Byte, val size : Int) : Range<Byte>, ByteIterable {
|
|||||||
|
|
||||||
val end : Byte
|
val end : Byte
|
||||||
|
|
||||||
|
val iteratorStart : Byte
|
||||||
|
|
||||||
fun minus() : ByteRange
|
fun minus() : ByteRange
|
||||||
|
|
||||||
fun step(step: Int) : ByteIterator
|
fun step(step: Int) : ByteIterator
|
||||||
@@ -51,6 +57,8 @@ class ShortRange(val start : Short, val size : Int) : Range<Short>, ShortIterabl
|
|||||||
|
|
||||||
fun contains (elem: Byte) : Boolean
|
fun contains (elem: Byte) : Boolean
|
||||||
|
|
||||||
|
val iteratorStart : Short
|
||||||
|
|
||||||
val end : Short
|
val end : Short
|
||||||
|
|
||||||
fun minus() : ShortRange
|
fun minus() : ShortRange
|
||||||
@@ -65,6 +73,8 @@ class CharRange(val start : Char, val size : Int) : Range<Char>, CharIterable {
|
|||||||
|
|
||||||
fun contains (elem: Char) : Boolean
|
fun contains (elem: Char) : Boolean
|
||||||
|
|
||||||
|
val iteratorStart : Char
|
||||||
|
|
||||||
val end : Char
|
val end : Char
|
||||||
|
|
||||||
fun minus() : CharRange
|
fun minus() : CharRange
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun box() : String {
|
||||||
|
for (i in "".indices) {
|
||||||
|
""[i]
|
||||||
|
}
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
val String?.indices : IntRange get() = IntRange(0, this.sure().length)
|
||||||
@@ -379,4 +379,8 @@ public class PrimitiveTypesTest extends CodegenTestCase {
|
|||||||
public void testKt930 () {
|
public void testKt930 () {
|
||||||
blackBoxFile("regressions/kt930.kt");
|
blackBoxFile("regressions/kt930.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt944 () {
|
||||||
|
blackBoxFile("regressions/kt944.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ public final class ByteRange implements Range<Byte>, ByteIterable, JetObject {
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte getIteratorStart () {
|
||||||
|
return count == 0 ? 1 : start;
|
||||||
|
}
|
||||||
|
|
||||||
public byte getEnd() {
|
public byte getEnd() {
|
||||||
return (byte) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
return (byte) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ public final class CharRange implements Range<Character>, CharIterable, JetObjec
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public char getIteratorStart () {
|
||||||
|
return count == 0 ? 1 : start;
|
||||||
|
}
|
||||||
|
|
||||||
public char getEnd() {
|
public char getEnd() {
|
||||||
return (char) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
return (char) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ public final class IntRange implements Range<Integer>, IntIterable, JetObject {
|
|||||||
return count < 0;
|
return count < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getIteratorStart () {
|
||||||
|
return count == 0 ? 1 : start;
|
||||||
|
}
|
||||||
|
|
||||||
public int getStart() {
|
public int getStart() {
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ public final class LongRange implements Range<Long>, LongIterable, JetObject {
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getIteratorStart () {
|
||||||
|
return count == 0 ? 1 : start;
|
||||||
|
}
|
||||||
|
|
||||||
public long getEnd() {
|
public long getEnd() {
|
||||||
return count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1;
|
return count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ public final class ShortRange implements Range<Short>, ShortIterable, JetObject
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getIteratorStart () {
|
||||||
|
return count == 0 ? 1 : start;
|
||||||
|
}
|
||||||
|
|
||||||
public short getEnd() {
|
public short getEnd() {
|
||||||
return (short) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
return (short) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user