diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt index 77c730b7388..25acadbf0ea 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt @@ -24,14 +24,8 @@ import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter abstract class AbstractBoundedValue( - protected val codegen: ExpressionCodegen, - protected val rangeCall: ResolvedCall, + override val instanceType: Type, override val isLowInclusive: Boolean = true, override val isHighInclusive: Boolean = true ) : BoundedValue { - override val instanceType: Type = codegen.asmType(rangeCall.resultingDescriptor.returnType!!) - - override fun putInstance(v: InstructionAdapter, type: Type) { - codegen.invokeFunction(rangeCall.call, rangeCall, StackValue.none()).put(type, v) - } } \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt index e46abf301e6..33b9cf3f08e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt @@ -35,14 +35,14 @@ class ArrayIndicesRangeValue(rangeCall: ResolvedCall) : override fun getBoundedValue(codegen: ExpressionCodegen) = SimpleBoundedValue( - codegen, rangeCall, - lowBound = StackValue.constant(0, asmElementType), - isLowInclusive = true, - highBound = StackValue.operation(Type.INT_TYPE) { v -> + codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + StackValue.constant(0, asmElementType), + true, + StackValue.operation(Type.INT_TYPE) { v -> codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v) v.arraylength() }, - isHighInclusive = false + false ) override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt index 03102bd2a05..f8a5136006f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt @@ -34,14 +34,14 @@ class CharSequenceIndicesRangeValue(rangeCall: ResolvedCall + codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + StackValue.constant(0, asmElementType), + true, + StackValue.operation(Type.INT_TYPE) { v -> codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v) v.invokeinterface("java/lang/CharSequence", "length", "()I") }, - isHighInclusive = false + false ) override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt index 4958dd9d678..49cc9c2756f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt @@ -34,14 +34,14 @@ class CollectionIndicesRangeValue(rangeCall: ResolvedCall + codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + StackValue.constant(0, asmElementType), + true, + StackValue.operation(Type.INT_TYPE) { v -> codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v) v.invokeinterface("java/util/Collection", "size", "()I") }, - isHighInclusive = false + false ) override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt index e6cf422d49c..19bc58ebd31 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.codegen.range import org.jetbrains.kotlin.codegen.ExpressionCodegen +import org.jetbrains.kotlin.codegen.generateCallReceiver +import org.jetbrains.kotlin.codegen.generateCallSingleArgument import org.jetbrains.kotlin.codegen.isClosedRangeContains import org.jetbrains.kotlin.codegen.range.forLoop.IteratorForLoopGenerator import org.jetbrains.kotlin.codegen.range.inExpression.InContinuousRangeOfComparableExpressionGenerator @@ -29,7 +31,11 @@ class ComparableRangeLiteralRangeValue( codegen: ExpressionCodegen, rangeCall: ResolvedCall ) : CallIntrinsicRangeValue(rangeCall) { - private val boundedValue = SimpleBoundedValue(codegen, rangeCall) + private val boundedValue = SimpleBoundedValue( + instanceType = codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + lowBound = codegen.generateCallReceiver(rangeCall), + highBound = codegen.generateCallSingleArgument(rangeCall) + ) override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) = IteratorForLoopGenerator(codegen, forExpression) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt index f5e792b73d5..72bd8a47dc1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt @@ -32,7 +32,7 @@ class DownToProgressionRangeValue(rangeCall: ResolvedCall, + instanceType: Type, val lowBound: StackValue, - isLowInclusive: Boolean, + isLowInclusive: Boolean = true, val highBound: StackValue, - isHighInclusive: Boolean -) : AbstractBoundedValue(codegen, rangeCall, isLowInclusive, isHighInclusive) { - constructor( - codegen: ExpressionCodegen, - rangeCall: ResolvedCall, - isLowInclusive: Boolean = true, - isHighInclusive: Boolean = true - ) : this( - codegen, - rangeCall, - codegen.generateCallReceiver(rangeCall), - isLowInclusive, - codegen.generateCallSingleArgument(rangeCall), - isHighInclusive - ) - - constructor( - codegen: ExpressionCodegen, - rangeCall: ResolvedCall, - lowBound: StackValue, - highBound: StackValue - ) : this(codegen, rangeCall, lowBound, true, highBound, true) + isHighInclusive: Boolean = true +) : AbstractBoundedValue(instanceType, isLowInclusive, isHighInclusive) { override fun putHighLow(v: InstructionAdapter, type: Type) { if (!lowBound.canHaveSideEffects() || !highBound.canHaveSideEffects()) {