blob: ea315ba73562d73fe7afd032ad62d9bb017e3cff [file] [log] [blame]
// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package class_inliner_lambda_k_style
private var COUNT = 0
fun next() = "${COUNT++}".padStart(3, '0')
fun main(args: Array<String>) {
testKotlinSequencesStateless(produceSequence(10))
testKotlinSequencesStateful(5, 2, produceSequence(10))
testBigExtraMethod()
testBigExtraMethodReturningLambda()
}
data class Record(val foo: String, val good: Boolean)
fun testKotlinSequencesStateless(strings: Sequence<String>) {
useRecord()
// Stateless k-style lambda
strings.map { Record(it, false) }.forEach { println(it) }
}
fun testKotlinSequencesStateful(a: Int, b: Int, strings: Sequence<String>) {
useRecord()
// Big stateful k-style lambda
val capture = next()
strings.map {
val x = it.toInt()
val y = a + x
val z = capture.toInt() + b
println("logging $x/$y/$z") // Intentional
Record(it, y % z == 0)
}.forEach {
println(it)
}
}
fun testBigExtraMethod() {
useRecord()
bigUserWithNotNullChecksAndTwoCalls(next()) { next() }
testBigExtraMethod2()
testBigExtraMethod3()
}
fun testBigExtraMethod2() {
bigUserWithNotNullChecksAndTwoCalls(next()) { next() }
}
fun testBigExtraMethod3() {
bigUserWithNotNullChecksAndTwoCalls(next()) { next() }
}
fun bigUserWithNotNullChecksAndTwoCalls(id: String, lambda: () -> String): String {
useRecord()
println("[A] logging call#$id returning ${lambda()}")
return "$id: ${lambda()}"
}
fun testBigExtraMethodReturningLambda() {
useRecord()
bigUserReturningLambda(next()) { next() } // Not used
testBigExtraMethodReturningLambda2()
testBigExtraMethodReturningLambda3()
}
fun testBigExtraMethodReturningLambda2() {
bigUserReturningLambda(next()) { next() } // Not used
}
fun testBigExtraMethodReturningLambda3() {
bigUserReturningLambda(next()) { next() } // Not used
}
fun bigUserReturningLambda(id: String, lambda: () -> String): () -> String {
useRecord()
println("[B] logging call#$id returning ${lambda()}")
println("[C] logging call#$id returning ${lambda()}")
return lambda
}
fun produceSequence(size: Int): Sequence<String> {
var count = size
return generateSequence { if (count-- > 0) next() else null }
}
// Need this to make sure testKotlinSequenceXXX is not processed
// concurrently with invoke() on lambdas.
@Synchronized fun useRecord() = useRecord2()
@Synchronized fun useRecord2() = Record("", true)