From 7880ba1e3fb64e592e2e27c7b2d1e742ec70e26b Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sun, 25 Sep 2011 08:16:44 +0300 Subject: [PATCH] for(IntRange) improved --- .../jet/codegen/ExpressionCodegen.java | 28 +++++++++++-------- idea/testData/codegen/traits/stdlib.jet | 12 +++++--- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 057c135f583..e93acaccf81 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -393,7 +393,6 @@ public class ExpressionCodegen extends JetVisitor { } private class ForInRangeLoopGenerator extends ForLoopGenerator { - private int myRangeVar; private int myEndVar; public ForInRangeLoopGenerator(JetForExpression expression, Type loopRangeType) { @@ -402,17 +401,24 @@ public class ExpressionCodegen extends JetVisitor { @Override protected void generatePrologue() { - myRangeVar = myMap.enterTemp(); myEndVar = myMap.enterTemp(); - gen(expression.getLoopRange(), loopRangeType); - v.dup(); - v.dup(); - v.store(myRangeVar, loopRangeType); + if(isIntRangeExpr(expression.getLoopRange())) { + JetBinaryExpression rangeExpression = (JetBinaryExpression) expression.getLoopRange(); + //noinspection ConstantConditions + 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.store(lookupLocal(parameterDescriptor), Type.INT_TYPE); - v.invokevirtual("jet/IntRange", "getEndValue", "()I"); - v.store(myEndVar, Type.INT_TYPE); + v.invokevirtual("jet/IntRange", "getStartValue", "()I"); + v.store(lookupLocal(parameterDescriptor), Type.INT_TYPE); + v.invokevirtual("jet/IntRange", "getEndValue", "()I"); + v.store(myEndVar, Type.INT_TYPE); + } } @Override @@ -429,7 +435,7 @@ public class ExpressionCodegen extends JetVisitor { @Override protected void cleanupTemp() { - myMap.leaveTemp(2); + myMap.leaveTemp(1); } } diff --git a/idea/testData/codegen/traits/stdlib.jet b/idea/testData/codegen/traits/stdlib.jet index c773105accf..65b84bbe2e8 100644 --- a/idea/testData/codegen/traits/stdlib.jet +++ b/idea/testData/codegen/traits/stdlib.jet @@ -2,17 +2,21 @@ trait ISized { val size : Int } +trait javaUtilIterator : java.util.Iterator { + override fun remove() : Unit { + throw UnsupportedOperationException() + } +} + trait ReadOnlyArray : ISized, java.lang.Iterable { fun get(index : Int) : T - class MyIterator() : java.util.Iterator { + class MyIterator() : javaUtilIterator { private var index = 0 override fun hasNext() : Boolean = index < size override fun next() : T = get(index++) - - override fun remove () : Unit {} } override fun iterator() : java.util.Iterator = MyIterator() @@ -22,7 +26,7 @@ trait WriteOnlyArray : ISized { fun set(index : Int, value : T) : Unit 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) } }