[Common IR] Do inlining of callable references of inline functions

^KT-52805 Fixed
This commit is contained in:
Alexander Korepanov
2022-07-27 09:33:51 +02:00
committed by Space
parent 3424e756ad
commit bb8da65188
21 changed files with 166 additions and 5 deletions
@@ -0,0 +1,41 @@
typealias Callback = () -> Unit
class CallbackComposer {
inline fun addTo(noinline block: Callback) {
asDynamic().push(block)
}
}
inline fun CallbackComposer.addToExtension(noinline block: Callback) {
asDynamic().push(block)
}
fun createCallbackBuilder(builder: CallbackComposer.() -> Unit): () -> Callback = {
val callbacks = arrayOf<Callback>()
builder(callbacks.unsafeCast<CallbackComposer>())
val composed: Callback = {
for (cb in callbacks) {
cb()
}
}
composed
}
var retVal = ""
fun appendToRetVal(c: String): () -> Unit = {
retVal += c
}
fun box(): String {
val callbackBuilder = createCallbackBuilder {
appendToRetVal("O").also(::addTo)
appendToRetVal("K").also(::addToExtension)
}
val callback = callbackBuilder()
callback()
return retVal
}
@@ -14,10 +14,7 @@ public fun <T, R> apply(x: T, fn: (T)->R): R =
import utils.*
// CHECK_CONTAINS_NO_CALLS: test except=imul TARGET_BACKENDS=JS
// FIXME: Not inlined on IR BE
// CHECK_CONTAINS_NO_CALLS: test except=multiplyBy2 IGNORED_BACKENDS=JS
// CHECK_CONTAINS_NO_CALLS: test except=imul
internal inline fun multiplyBy2(x: Int): Int = x * 2