for(IntRange) improved
This commit is contained in:
@@ -393,7 +393,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ForInRangeLoopGenerator extends ForLoopGenerator {
|
private class ForInRangeLoopGenerator extends ForLoopGenerator {
|
||||||
private int myRangeVar;
|
|
||||||
private int myEndVar;
|
private int myEndVar;
|
||||||
|
|
||||||
public ForInRangeLoopGenerator(JetForExpression expression, Type loopRangeType) {
|
public ForInRangeLoopGenerator(JetForExpression expression, Type loopRangeType) {
|
||||||
@@ -402,17 +401,24 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void generatePrologue() {
|
protected void generatePrologue() {
|
||||||
myRangeVar = myMap.enterTemp();
|
|
||||||
myEndVar = myMap.enterTemp();
|
myEndVar = myMap.enterTemp();
|
||||||
gen(expression.getLoopRange(), loopRangeType);
|
if(isIntRangeExpr(expression.getLoopRange())) {
|
||||||
v.dup();
|
JetBinaryExpression rangeExpression = (JetBinaryExpression) expression.getLoopRange();
|
||||||
v.dup();
|
//noinspection ConstantConditions
|
||||||
v.store(myRangeVar, loopRangeType);
|
gen(rangeExpression.getLeft(), Type.INT_TYPE);
|
||||||
|
v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE);
|
||||||
|
gen(rangeExpression.getRight(), Type.INT_TYPE);
|
||||||
|
v.store(myEndVar, Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gen(expression.getLoopRange(), loopRangeType);
|
||||||
|
v.dup();
|
||||||
|
|
||||||
v.invokevirtual("jet/IntRange", "getStartValue", "()I");
|
v.invokevirtual("jet/IntRange", "getStartValue", "()I");
|
||||||
v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE);
|
v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE);
|
||||||
v.invokevirtual("jet/IntRange", "getEndValue", "()I");
|
v.invokevirtual("jet/IntRange", "getEndValue", "()I");
|
||||||
v.store(myEndVar, Type.INT_TYPE);
|
v.store(myEndVar, Type.INT_TYPE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -429,7 +435,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void cleanupTemp() {
|
protected void cleanupTemp() {
|
||||||
myMap.leaveTemp(2);
|
myMap.leaveTemp(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,21 @@ trait ISized {
|
|||||||
val size : Int
|
val size : Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trait javaUtilIterator<T> : java.util.Iterator<T> {
|
||||||
|
override fun remove() : Unit {
|
||||||
|
throw UnsupportedOperationException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trait ReadOnlyArray<out T> : ISized, java.lang.Iterable<T> {
|
trait ReadOnlyArray<out T> : ISized, java.lang.Iterable<T> {
|
||||||
fun get(index : Int) : T
|
fun get(index : Int) : T
|
||||||
|
|
||||||
class MyIterator() : java.util.Iterator<T> {
|
class MyIterator() : javaUtilIterator<T> {
|
||||||
private var index = 0
|
private var index = 0
|
||||||
|
|
||||||
override fun hasNext() : Boolean = index < size
|
override fun hasNext() : Boolean = index < size
|
||||||
|
|
||||||
override fun next() : T = get(index++)
|
override fun next() : T = get(index++)
|
||||||
|
|
||||||
override fun remove () : Unit {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun iterator() : java.util.Iterator<T> = MyIterator()
|
override fun iterator() : java.util.Iterator<T> = MyIterator()
|
||||||
@@ -22,7 +26,7 @@ trait WriteOnlyArray<in T> : ISized {
|
|||||||
fun set(index : Int, value : T) : Unit
|
fun set(index : Int, value : T) : Unit
|
||||||
|
|
||||||
fun set(from: Int, count: Int, value: T) {
|
fun set(from: Int, count: Int, value: T) {
|
||||||
for(i in from..(from+count-1)) {
|
for(i in from..from+count-1) {
|
||||||
set(i, value)
|
set(i, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user