From 0b580b274126d9bec188bd0c5d17c6c22f31892c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 20 Jun 2019 14:36:16 +0300 Subject: [PATCH] Refactor: SimpleBoundedValue, AbstractBoundedValue -> BoundedValue class --- .../codegen/range/AbstractBoundedValue.kt | 26 ------------------- .../codegen/range/ArrayIndicesRangeValue.kt | 4 +-- ...{SimpleBoundedValue.kt => BoundedValue.kt} | 13 +++++----- .../range/CharSequenceIndicesRangeValue.kt | 4 +-- .../range/CollectionIndicesRangeValue.kt | 4 +-- .../range/ComparableRangeLiteralRangeValue.kt | 3 +-- .../range/DownToProgressionRangeValue.kt | 3 +-- ...PrimitiveNumberRangeIntrinsicRangeValue.kt | 2 +- .../PrimitiveNumberRangeLiteralRangeValue.kt | 7 +++-- .../range/PrimitiveNumberUntilRangeValue.kt | 3 +-- .../kotlin/codegen/range/RangeValue.kt | 11 -------- ...itelySafeSimpleProgressionLoopGenerator.kt | 8 +++--- .../ForInSimpleProgressionLoopGenerator.kt | 8 +++--- ...ingPointRangeLiteralExpressionGenerator.kt | 4 +-- 14 files changed, 27 insertions(+), 73 deletions(-) delete mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt rename compiler/backend/src/org/jetbrains/kotlin/codegen/range/{SimpleBoundedValue.kt => BoundedValue.kt} (79%) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt deleted file mode 100644 index 8fd45908bf6..00000000000 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/AbstractBoundedValue.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.codegen.range - -import org.jetbrains.org.objectweb.asm.Type - -abstract class AbstractBoundedValue( - override val instanceType: Type, - override val isLowInclusive: Boolean = true, - override val isHighInclusive: Boolean = true -) : BoundedValue { -} \ 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 690c0a235af..044f19655b7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ArrayIndicesRangeValue.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.generateCallReceiver import org.jetbrains.kotlin.codegen.range.comparison.IntComparisonGenerator -import org.jetbrains.kotlin.codegen.range.comparison.getComparisonGeneratorForKotlinType import org.jetbrains.kotlin.codegen.range.forLoop.ForInDefinitelySafeSimpleProgressionLoopGenerator import org.jetbrains.kotlin.codegen.range.forLoop.ForInSimpleProgressionLoopGenerator import org.jetbrains.kotlin.codegen.range.forLoop.ForLoopGenerator @@ -36,8 +35,7 @@ class ArrayIndicesRangeValue(rangeCall: ResolvedCall) : private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall) override fun getBoundedValue(codegen: ExpressionCodegen) = - SimpleBoundedValue( - codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + BoundedValue( StackValue.constant(0, codegen.asmType(elementKotlinType), elementKotlinType), true, StackValue.operation(Type.INT_TYPE) { v -> diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/BoundedValue.kt similarity index 79% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt rename to compiler/backend/src/org/jetbrains/kotlin/codegen/range/BoundedValue.kt index 37c47eaa1c5..b371741f92c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/BoundedValue.kt @@ -24,15 +24,16 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter /** * Low level abstraction for bounded range that is used to generate contains checks and for loops. */ -class SimpleBoundedValue( - instanceType: Type, +class BoundedValue( val lowBound: StackValue, - isLowInclusive: Boolean = true, + val isLowInclusive: Boolean = true, val highBound: StackValue, - isHighInclusive: Boolean = true -) : AbstractBoundedValue(instanceType, isLowInclusive, isHighInclusive) { + val isHighInclusive: Boolean = true +) { - override fun putHighLow(v: InstructionAdapter, type: Type) { + // It is necessary to maintain the proper evaluation order as of Kotlin 1.0 and 1.1 + // to evaluate range bounds left to right and put them on stack as 'high; low'. + fun putHighLow(v: InstructionAdapter, type: Type) { if (!lowBound.canHaveSideEffects() || !highBound.canHaveSideEffects()) { highBound.put(type, v) lowBound.put(type, v) 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 b45bf456062..a51ff008b31 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CharSequenceIndicesRangeValue.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.generateCallReceiver import org.jetbrains.kotlin.codegen.range.comparison.IntComparisonGenerator -import org.jetbrains.kotlin.codegen.range.comparison.getComparisonGeneratorForKotlinType import org.jetbrains.kotlin.codegen.range.forLoop.ForInDefinitelySafeSimpleProgressionLoopGenerator import org.jetbrains.kotlin.codegen.range.forLoop.ForInSimpleProgressionLoopGenerator import org.jetbrains.kotlin.descriptors.CallableDescriptor @@ -35,8 +34,7 @@ class CharSequenceIndicesRangeValue(rangeCall: ResolvedCall 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 7c036c8bd5e..854a4df17b3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/CollectionIndicesRangeValue.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.generateCallReceiver import org.jetbrains.kotlin.codegen.range.comparison.IntComparisonGenerator -import org.jetbrains.kotlin.codegen.range.comparison.getComparisonGeneratorForKotlinType import org.jetbrains.kotlin.codegen.range.forLoop.ForInDefinitelySafeSimpleProgressionLoopGenerator import org.jetbrains.kotlin.codegen.range.forLoop.ForInSimpleProgressionLoopGenerator import org.jetbrains.kotlin.descriptors.CallableDescriptor @@ -35,8 +34,7 @@ class CollectionIndicesRangeValue(rangeCall: ResolvedCall 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 0655e1e3c3d..d403712dd11 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/ComparableRangeLiteralRangeValue.kt @@ -30,8 +30,7 @@ class ComparableRangeLiteralRangeValue( codegen: ExpressionCodegen, rangeCall: ResolvedCall ) : CallIntrinsicRangeValue(rangeCall) { - private val boundedValue = SimpleBoundedValue( - instanceType = codegen.asmType(rangeCall.resultingDescriptor.returnType!!), + private val boundedValue = BoundedValue( lowBound = codegen.generateCallReceiver(rangeCall), highBound = codegen.generateCallSingleArgument(rangeCall) ) 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 0e79e32fd0b..49bdcb90841 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/DownToProgressionRangeValue.kt @@ -32,8 +32,7 @@ class DownToProgressionRangeValue(rangeCall: ResolvedCall CallBasedInExpressionGenerator(codegen, operatorReference) comparedType == Type.DOUBLE_TYPE || comparedType == Type.FLOAT_TYPE -> { - val rangeLiteral = getBoundedValue(codegen) as? SimpleBoundedValue + val rangeLiteral = getBoundedValue(codegen) as? BoundedValue ?: throw AssertionError("Floating point intrinsic range value should be a range literal") InFloatingPointRangeLiteralExpressionGenerator(operatorReference, rangeLiteral, comparisonGenerator, codegen.frameMap) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeLiteralRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeLiteralRangeValue.kt index fd47e2b2cc4..a8f8396d632 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeLiteralRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberRangeLiteralRangeValue.kt @@ -36,15 +36,14 @@ class PrimitiveNumberRangeLiteralRangeValue( ) : PrimitiveNumberRangeIntrinsicRangeValue(rangeCall), ReversableRangeValue { - override fun getBoundedValue(codegen: ExpressionCodegen): SimpleBoundedValue { + override fun getBoundedValue(codegen: ExpressionCodegen): BoundedValue { val instanceType = codegen.asmType(rangeCall.resultingDescriptor.returnType!!) val lowBound = codegen.generateCallReceiver(rangeCall) if (codegen.canBeSpecializedByExcludingHighBound(rangeCall)) { val highBound = (rangeCall.getFirstArgumentExpression() as KtBinaryExpression).left - return SimpleBoundedValue(instanceType, lowBound, true, codegen.gen(highBound), false) + return BoundedValue(lowBound, true, codegen.gen(highBound), false) } - return SimpleBoundedValue( - instanceType = instanceType, + return BoundedValue( lowBound = lowBound, highBound = codegen.generateCallSingleArgument(rangeCall) ) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberUntilRangeValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberUntilRangeValue.kt index f3e18b7e162..0f646078fc1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberUntilRangeValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/PrimitiveNumberUntilRangeValue.kt @@ -31,8 +31,7 @@ class PrimitiveNumberUntilRangeValue(rangeCall: ResolvedCall