Fix issue getting the size property from Collection bounded type
parameters, when lowering for-loops over Collection.indices.
This commit is contained in:
committed by
max-kammerer
parent
30679ebfaf
commit
21178a4f1a
+4
-1
@@ -518,8 +518,11 @@ internal class CollectionIndicesHandler(context: CommonBackendContext) : Indices
|
|||||||
parameterCount { it == 0 }
|
parameterCount { it == 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The lowering operates on subtypes of Collection. Therefore, the IrType could be
|
||||||
|
// a type parameter bounded by Collection. When that is the case, we cannot get
|
||||||
|
// the class from the type and instead uses the Collection getter.
|
||||||
override val IrType.sizePropertyGetter
|
override val IrType.sizePropertyGetter
|
||||||
get() = getClass()!!.getPropertyGetter("size")!!.owner
|
get() = getClass()?.getPropertyGetter("size")?.owner ?: context.ir.symbols.collection.getPropertyGetter("size")!!.owner
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CharSequenceIndicesHandler(context: CommonBackendContext) : IndicesHandler(context) {
|
internal class CharSequenceIndicesHandler(context: CommonBackendContext) : IndicesHandler(context) {
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun <T: CharSequence> test(s: T): Int {
|
||||||
|
var result = 0
|
||||||
|
for (i in s.indices) {
|
||||||
|
result = result * 10 + (i + 1)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val test = test("abcd")
|
||||||
|
if (test != 1234) return "Fail: $test"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
fun <T : Collection<*>> sumIndices(c: T): Int {
|
||||||
|
var sum = 0
|
||||||
|
for (i in c.indices) {
|
||||||
|
sum += i
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val list = listOf(0, 0, 0, 0)
|
||||||
|
val sum = sumIndices(list)
|
||||||
|
assertEquals(6, sum)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+3
-1
@@ -1,4 +1,4 @@
|
|||||||
fun <T: CharSequence> test(sequence: T) {
|
fun <T : CharSequence> test(sequence: T) {
|
||||||
var s = ""
|
var s = ""
|
||||||
for (c in sequence) {
|
for (c in sequence) {
|
||||||
s += c
|
s += c
|
||||||
@@ -8,3 +8,5 @@ fun <T: CharSequence> test(sequence: T) {
|
|||||||
// 0 iterator
|
// 0 iterator
|
||||||
// 0 hasNext
|
// 0 hasNext
|
||||||
// 0 nextChar
|
// 0 nextChar
|
||||||
|
// 1 INVOKEINTERFACE java/lang/CharSequence\.charAt \(I\)C
|
||||||
|
// 1 INVOKEINTERFACE java/lang/CharSequence\.length \(\)I
|
||||||
|
|||||||
compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCharSequenceTypeParameterIndices.kt
Vendored
+2
-1
@@ -1,4 +1,4 @@
|
|||||||
fun <T: CharSequence> test(s: T): Int {
|
fun <T : CharSequence> test(s: T): Int {
|
||||||
var result = 0
|
var result = 0
|
||||||
for (i in s.indices) {
|
for (i in s.indices) {
|
||||||
result = result * 10 + (i + 1)
|
result = result * 10 + (i + 1)
|
||||||
@@ -14,6 +14,7 @@ fun <T: CharSequence> test(s: T): Int {
|
|||||||
// 0 getEnd
|
// 0 getEnd
|
||||||
// 0 getFirst
|
// 0 getFirst
|
||||||
// 0 getLast
|
// 0 getLast
|
||||||
|
// 1 INVOKEINTERFACE java/lang/CharSequence\.length \(\)I
|
||||||
|
|
||||||
// JVM_TEMPLATES
|
// JVM_TEMPLATES
|
||||||
// 0 IF_ICMPGT
|
// 0 IF_ICMPGT
|
||||||
|
|||||||
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
fun <T : Collection<*>> test(c: T) {
|
||||||
|
var sum = 0
|
||||||
|
for (i in c.indices) {
|
||||||
|
sum += i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 iterator
|
||||||
|
// 0 getStart
|
||||||
|
// 0 getEnd
|
||||||
|
// 0 getFirst
|
||||||
|
// 0 getLast
|
||||||
|
// 1 INVOKEINTERFACE java/util/Collection\.size \(\)I
|
||||||
|
|
||||||
|
// JVM non-IR uses while.
|
||||||
|
// JVM IR uses if + do-while.
|
||||||
|
|
||||||
|
// JVM_TEMPLATES
|
||||||
|
// 1 IF_ICMPGE
|
||||||
|
// 1 IF
|
||||||
|
|
||||||
|
// JVM_IR_TEMPLATES
|
||||||
|
// 1 IF_ICMPGT
|
||||||
|
// 1 IF_ICMPLE
|
||||||
|
// 2 IF
|
||||||
+10
@@ -19835,6 +19835,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCharSequenceTypeParameterIndices.kt")
|
||||||
|
public void testForInCharSequenceTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
||||||
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
||||||
@@ -19845,6 +19850,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
@@ -1925,6 +1925,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
+10
@@ -19835,6 +19835,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCharSequenceTypeParameterIndices.kt")
|
||||||
|
public void testForInCharSequenceTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
||||||
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
||||||
@@ -19845,6 +19850,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
+10
@@ -18654,6 +18654,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCharSequenceTypeParameterIndices.kt")
|
||||||
|
public void testForInCharSequenceTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
||||||
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
||||||
@@ -18664,6 +18669,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
+5
@@ -1880,6 +1880,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/bytecodeText/forLoop/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
Generated
+10
@@ -15585,6 +15585,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCharSequenceTypeParameterIndices.kt")
|
||||||
|
public void testForInCharSequenceTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
||||||
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
||||||
@@ -15595,6 +15600,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
+10
@@ -16740,6 +16740,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCharSequenceTypeParameterIndices.kt")
|
||||||
|
public void testForInCharSequenceTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCharSequenceTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
@TestMetadata("forInCollectionImplicitReceiverIndices.kt")
|
||||||
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
public void testForInCollectionImplicitReceiverIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionImplicitReceiverIndices.kt");
|
||||||
@@ -16750,6 +16755,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionIndices.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("forInCollectionTypeParameterIndices.kt")
|
||||||
|
public void testForInCollectionTypeParameterIndices() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInCollectionTypeParameterIndices.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forInNonOptimizedIndices.kt")
|
@TestMetadata("forInNonOptimizedIndices.kt")
|
||||||
public void testForInNonOptimizedIndices() throws Exception {
|
public void testForInNonOptimizedIndices() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
runTest("compiler/testData/codegen/box/ranges/forInIndices/forInNonOptimizedIndices.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user