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
+30
@@ -0,0 +1,30 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingString(private val s: String) : CharSequence {
|
||||
var lengthCtr = 0
|
||||
var getCtr = 0
|
||||
|
||||
override val length: Int
|
||||
get() = s.length.also { lengthCtr++ }
|
||||
|
||||
override fun subSequence(startIndex: Int, endIndex: Int) = TODO()
|
||||
override fun get(index: Int) = s.get(index).also { getCtr++ }
|
||||
}
|
||||
|
||||
val cs = CountingString("abcd")
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((index, x) in cs.withIndex()) {
|
||||
s.append("$index:$x;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "0:a;1:b;2:c;3:d;") return "fail: '$ss'"
|
||||
if (cs.lengthCtr != 5) return "lengthCtr != 5, was: '${cs.lengthCtr}'"
|
||||
if (cs.getCtr != 4) return "getCtr != 4, was: '${cs.getCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingString(private val s: String) : CharSequence {
|
||||
var lengthCtr = 0
|
||||
var getCtr = 0
|
||||
|
||||
override val length: Int
|
||||
get() = s.length.also { lengthCtr++ }
|
||||
|
||||
override fun subSequence(startIndex: Int, endIndex: Int) = TODO()
|
||||
override fun get(index: Int) = s.get(index).also { getCtr++ }
|
||||
}
|
||||
|
||||
val cs = CountingString("abcd")
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((index, _) in cs.withIndex()) {
|
||||
s.append("$index;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "0;1;2;3;") return "fail: '$ss'"
|
||||
if (cs.lengthCtr != 5) return "lengthCtr != 5, was: '${cs.lengthCtr}'"
|
||||
if (cs.getCtr != 4) return "getCtr != 4, was: '${cs.getCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
class CountingString(private val s: String) : CharSequence {
|
||||
var lengthCtr = 0
|
||||
var getCtr = 0
|
||||
|
||||
override val length: Int
|
||||
get() = s.length.also { lengthCtr++ }
|
||||
|
||||
override fun subSequence(startIndex: Int, endIndex: Int) = TODO()
|
||||
override fun get(index: Int) = s.get(index).also { getCtr++ }
|
||||
}
|
||||
val cs = CountingString("abcd")
|
||||
|
||||
fun box(): String {
|
||||
val s = StringBuilder()
|
||||
|
||||
for ((_, x) in cs.withIndex()) {
|
||||
s.append("$x;")
|
||||
}
|
||||
|
||||
val ss = s.toString()
|
||||
if (ss != "a;b;c;d;") return "fail: '$ss'"
|
||||
if (cs.lengthCtr != 5) return "lengthCtr != 5, was: '${cs.lengthCtr}'"
|
||||
if (cs.getCtr != 4) return "getCtr != 4, was: '${cs.getCtr}'"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user