diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index da59861265d..55f60c98433 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -536,7 +536,7 @@ public class ExpressionCodegen extends JetVisitor { gen(expression.getLoopRange(), loopRangeType); v.dup(); - v.invokevirtual("jet/IntRange", "getStart", "()I"); + v.invokevirtual("jet/IntRange", "getIteratorStart", "()I"); v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE); v.invokevirtual("jet/IntRange", "getEnd", "()I"); v.store(myEndVar, Type.INT_TYPE); diff --git a/compiler/frontend/src/jet/Ranges.jet b/compiler/frontend/src/jet/Ranges.jet index ff1140ec275..2426900bf78 100644 --- a/compiler/frontend/src/jet/Ranges.jet +++ b/compiler/frontend/src/jet/Ranges.jet @@ -11,6 +11,8 @@ class IntRange(val start : Int, val size : Int) : Range, IntIterable { val end : Int + val iteratorStart : Int + fun minus() : IntRange fun step(step: Int) : IntIterator @@ -23,6 +25,8 @@ class LongRange(val start : Long, val size : Long) : Range, LongIterable { fun contains (elem: Long) : Boolean + val iteratorStart : Long + val end : Long fun minus() : LongRange @@ -39,6 +43,8 @@ class ByteRange(val start : Byte, val size : Int) : Range, ByteIterable { val end : Byte + val iteratorStart : Byte + fun minus() : ByteRange fun step(step: Int) : ByteIterator @@ -51,6 +57,8 @@ class ShortRange(val start : Short, val size : Int) : Range, ShortIterabl fun contains (elem: Byte) : Boolean + val iteratorStart : Short + val end : Short fun minus() : ShortRange @@ -65,6 +73,8 @@ class CharRange(val start : Char, val size : Int) : Range, CharIterable { fun contains (elem: Char) : Boolean + val iteratorStart : Char + val end : Char fun minus() : CharRange diff --git a/compiler/testData/codegen/regressions/kt944.kt b/compiler/testData/codegen/regressions/kt944.kt new file mode 100644 index 00000000000..4dca91f84c0 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt944.kt @@ -0,0 +1,8 @@ +fun box() : String { + for (i in "".indices) { + ""[i] + } + return "OK" +} + +val String?.indices : IntRange get() = IntRange(0, this.sure().length) \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 0863a06d713..9f5c8fe928e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -379,4 +379,8 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testKt930 () { blackBoxFile("regressions/kt930.kt"); } + + public void testKt944 () { + blackBoxFile("regressions/kt944.kt"); + } } diff --git a/stdlib/src/jet/ByteRange.java b/stdlib/src/jet/ByteRange.java index 454691a69e2..0d1a8e04d2d 100644 --- a/stdlib/src/jet/ByteRange.java +++ b/stdlib/src/jet/ByteRange.java @@ -30,6 +30,10 @@ public final class ByteRange implements Range, ByteIterable, JetObject { return start; } + public byte getIteratorStart () { + return count == 0 ? 1 : start; + } + public byte getEnd() { return (byte) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1); } diff --git a/stdlib/src/jet/CharRange.java b/stdlib/src/jet/CharRange.java index 4c6ed5d46f6..f7c849423b6 100644 --- a/stdlib/src/jet/CharRange.java +++ b/stdlib/src/jet/CharRange.java @@ -30,6 +30,10 @@ public final class CharRange implements Range, CharIterable, JetObjec return start; } + public char getIteratorStart () { + return count == 0 ? 1 : start; + } + public char getEnd() { return (char) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1); } diff --git a/stdlib/src/jet/IntRange.java b/stdlib/src/jet/IntRange.java index fbc671d39c4..601106649eb 100644 --- a/stdlib/src/jet/IntRange.java +++ b/stdlib/src/jet/IntRange.java @@ -33,6 +33,10 @@ public final class IntRange implements Range, IntIterable, JetObject { return count < 0; } + public int getIteratorStart () { + return count == 0 ? 1 : start; + } + public int getStart() { return start; } diff --git a/stdlib/src/jet/LongRange.java b/stdlib/src/jet/LongRange.java index 2494241dc95..ef72c8c391a 100644 --- a/stdlib/src/jet/LongRange.java +++ b/stdlib/src/jet/LongRange.java @@ -37,6 +37,10 @@ public final class LongRange implements Range, LongIterable, JetObject { return start; } + public long getIteratorStart () { + return count == 0 ? 1 : start; + } + public long getEnd() { return count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1; } diff --git a/stdlib/src/jet/ShortRange.java b/stdlib/src/jet/ShortRange.java index dcddf605be1..26ad4c906c5 100644 --- a/stdlib/src/jet/ShortRange.java +++ b/stdlib/src/jet/ShortRange.java @@ -37,6 +37,10 @@ public final class ShortRange implements Range, ShortIterable, JetObject return start; } + public int getIteratorStart () { + return count == 0 ? 1 : start; + } + public short getEnd() { return (short) (count < 0 ? start + count + 1: count == 0 ? 0 : start+count-1); }