blob: 4b55c57484b4160673c7c3dc65eb74f1937ea03c [file] [log] [blame]
// Copyright (c) 2017, 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.
class KotlinInline {
fun processObject(obj: Any, func: (Any) -> Unit) {
func(obj)
}
fun printObject(obj: Any) {
println(obj)
}
fun invokeInlinedFunctions() {
inlinedA {
val inA = 1
inlinedB {
val inB = 2
foo(inA, inB)
}
}
}
inline fun inlinedA(f: () -> Unit) {
f()
}
inline fun inlinedB(f: () -> Unit) {
f()
}
fun foo(a: Int, b: Int) {
println("a=$a, b=$b")
}
fun emptyMethod(unused: Int) {
}
fun singleInline() {
emptyMethod(0)
inlined()
emptyMethod(1)
}
inline fun inlined() {
emptyMethod(-1)
}
// Double inlining
fun testNestedInlining() {
val l1 = Int.MAX_VALUE
val l2 = Int.MIN_VALUE
inlinee1(l1, l2)
}
inline fun inlinee1(a: Int, b: Int) {
val c = a - 2
inlinee2(1) {
val left = a + b
val right = a - b
foo(left, right)
}
inlinee2(c) {
foo(b, a)
}
}
inline fun inlinee2(p: Int, block: () -> Unit) {
if (p > 0) {
block()
}
}
companion object {
@JvmStatic fun main(args: Array<String>) {
println("Hello world!")
val instance = KotlinInline()
instance.processObject(instance, instance::printObject)
instance.invokeInlinedFunctions()
instance.singleInline()
instance.testNestedInlining()
}
}
}