Replace BoundedValue objects in 'indices' with SimpleBoundedValue
This commit is contained in:
@@ -25,21 +25,21 @@ import org.jetbrains.kotlin.psi.KtForExpression
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|
||||||
|
|
||||||
class ArrayIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
class ArrayIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
||||||
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
||||||
|
|
||||||
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
||||||
object : AbstractBoundedValue(codegen, rangeCall, isHighInclusive = false) {
|
SimpleBoundedValue(
|
||||||
override fun putHighLow(v: InstructionAdapter, type: Type) {
|
codegen, rangeCall,
|
||||||
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
lowBound = StackValue.constant(0, asmElementType),
|
||||||
v.arraylength()
|
isLowInclusive = true,
|
||||||
StackValue.coerce(Type.INT_TYPE, type, v)
|
highBound = StackValue.operation(Type.INT_TYPE) { v ->
|
||||||
|
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
||||||
StackValue.constant(0, asmElementType).put(type, v)
|
v.arraylength()
|
||||||
}
|
},
|
||||||
}
|
isHighInclusive = false
|
||||||
|
)
|
||||||
|
|
||||||
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
||||||
ForInArrayIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
ForInArrayIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
||||||
|
|||||||
+10
-10
@@ -25,21 +25,21 @@ import org.jetbrains.kotlin.psi.KtForExpression
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|
||||||
|
|
||||||
class CharSequenceIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
class CharSequenceIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
||||||
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
||||||
|
|
||||||
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
||||||
object : AbstractBoundedValue(codegen, rangeCall, isHighInclusive = false) {
|
SimpleBoundedValue(
|
||||||
override fun putHighLow(v: InstructionAdapter, type: Type) {
|
codegen, rangeCall,
|
||||||
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
lowBound = StackValue.constant(0, asmElementType),
|
||||||
v.invokeinterface("java/lang/CharSequence", "length", "()I")
|
isLowInclusive = true,
|
||||||
StackValue.coerce(Type.INT_TYPE, type, v)
|
highBound = StackValue.operation(Type.INT_TYPE) { v ->
|
||||||
|
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
||||||
StackValue.constant(0, asmElementType).put(type, v)
|
v.invokeinterface("java/lang/CharSequence", "length", "()I")
|
||||||
}
|
},
|
||||||
}
|
isHighInclusive = false
|
||||||
|
)
|
||||||
|
|
||||||
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
||||||
ForInCharSequenceIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
ForInCharSequenceIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
||||||
|
|||||||
+10
-10
@@ -25,21 +25,21 @@ import org.jetbrains.kotlin.psi.KtForExpression
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|
||||||
|
|
||||||
class CollectionIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
class CollectionIndicesRangeValue(rangeCall: ResolvedCall<out CallableDescriptor>): PrimitiveNumberRangeIntrinsicRangeValue(rangeCall) {
|
||||||
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
private val expectedReceiverType: KotlinType = ExpressionCodegen.getExpectedReceiverType(rangeCall)
|
||||||
|
|
||||||
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
override fun getBoundedValue(codegen: ExpressionCodegen) =
|
||||||
object : AbstractBoundedValue(codegen, rangeCall, isHighInclusive = false) {
|
SimpleBoundedValue(
|
||||||
override fun putHighLow(v: InstructionAdapter, type: Type) {
|
codegen, rangeCall,
|
||||||
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
lowBound = StackValue.constant(0, asmElementType),
|
||||||
v.invokeinterface("java/util/Collection", "size", "()I")
|
isLowInclusive = true,
|
||||||
StackValue.coerce(Type.INT_TYPE, type, v)
|
highBound = StackValue.operation(Type.INT_TYPE) { v ->
|
||||||
|
codegen.generateCallReceiver(rangeCall).put(codegen.asmType(expectedReceiverType), v)
|
||||||
StackValue.constant(0, asmElementType).put(type, v)
|
v.invokeinterface("java/util/Collection", "size", "()I")
|
||||||
}
|
},
|
||||||
}
|
isHighInclusive = false
|
||||||
|
)
|
||||||
|
|
||||||
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
override fun createForLoopGenerator(codegen: ExpressionCodegen, forExpression: KtForExpression) =
|
||||||
ForInCollectionIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
ForInCollectionIndicesRangeLoopGenerator(codegen, forExpression, rangeCall)
|
||||||
|
|||||||
Reference in New Issue
Block a user