JVM: Always invoke get()/charAt() in optimized for-loop over
CharSequence.withIndex(), even if element variable is unused in destructuring declaration. #KT-34779 Fixed
This commit is contained in:
committed by
Dmitry Petrov
parent
411dc5d60e
commit
f444702cf3
+31
@@ -0,0 +1,31 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingIterable<out T>(private val s: Iterable<T>) : Iterable<T> {
|
||||
var hasNextCtr = 0
|
||||
var nextCtr = 0
|
||||
|
||||
inner class CountingIterableIterator(private val it: Iterator<T>) : Iterator<T> {
|
||||
override fun hasNext() = it.hasNext().also { hasNextCtr++ }
|
||||
override fun next() = it.next().also { nextCtr++ }
|
||||
}
|
||||
|
||||
override fun iterator() = CountingIterableIterator(s.iterator())
|
||||
}
|
||||
|
||||
val xs = CountingIterable(listOf("a", "b", "c", "d"))
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((index, x) in xs.withIndex()) {
|
||||
s.append("$index:$x;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "0:a;1:b;2:c;3:d;") return "fail: '$ss'"
|
||||
if (xs.hasNextCtr != 5) return "hasNextCtr != 5, was: '${xs.hasNextCtr}'"
|
||||
if (xs.nextCtr != 4) return "nextCtr != 4, was: '${xs.nextCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingIterable<out T>(private val s: Iterable<T>) : Iterable<T> {
|
||||
var hasNextCtr = 0
|
||||
var nextCtr = 0
|
||||
|
||||
inner class CountingIterableIterator(private val it: Iterator<T>) : Iterator<T> {
|
||||
override fun hasNext() = it.hasNext().also { hasNextCtr++ }
|
||||
override fun next() = it.next().also { nextCtr++ }
|
||||
}
|
||||
|
||||
override fun iterator() = CountingIterableIterator(s.iterator())
|
||||
}
|
||||
|
||||
val xs = CountingIterable(listOf("a", "b", "c", "d"))
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((index, _) in xs.withIndex()) {
|
||||
s.append("$index;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "0;1;2;3;") return "fail: '$ss'"
|
||||
if (xs.hasNextCtr != 5) return "hasNextCtr != 5, was: '${xs.hasNextCtr}'"
|
||||
if (xs.nextCtr != 4) return "nextCtr != 4, was: '${xs.nextCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingIterable<out T>(private val s: Iterable<T>) : Iterable<T> {
|
||||
var hasNextCtr = 0
|
||||
var nextCtr = 0
|
||||
|
||||
inner class CountingIterableIterator(private val it: Iterator<T>) : Iterator<T> {
|
||||
override fun hasNext() = it.hasNext().also { hasNextCtr++ }
|
||||
override fun next() = it.next().also { nextCtr++ }
|
||||
}
|
||||
|
||||
override fun iterator() = CountingIterableIterator(s.iterator())
|
||||
}
|
||||
|
||||
val xs = CountingIterable(listOf("a", "b", "c", "d"))
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((_, x) in xs.withIndex()) {
|
||||
s.append("$x;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "a;b;c;d;") return "fail: '$ss'"
|
||||
if (xs.hasNextCtr != 5) return "hasNextCtr != 5, was: '${xs.hasNextCtr}'"
|
||||
if (xs.nextCtr != 4) return "nextCtr != 4, was: '${xs.nextCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user