01c16ed736
^KT-64570
47 lines
1.1 KiB
Markdown
47 lines
1.1 KiB
Markdown
# Why is JVM model simpler than klib?
|
|
|
|
Inline function have several more dimensions of declaration changes, compared to normal ones.
|
|
- Type parameter can be converted between reified and not
|
|
- Lambda paramerets can be inline/noinline/crossinline
|
|
- inline keyword itself can be added/removed
|
|
|
|
In klib compatibility model, we need to answer what happens in all these cases.
|
|
|
|
In jvm compatibility mode, there are effectively no inline functions on link-time
|
|
(except corner cases like [calling from java](calling-from-java.md) and [inline override](inline-override.md)).
|
|
, but in that cases, inline functions already behaves as normal ones.
|
|
So they can't be changed, and this makes mental model much easier.
|
|
|
|
For example, what this non-local return even mean, when `l` is `noinline`?
|
|
|
|
```kotlin
|
|
// MODULE: lib
|
|
// FILE: lib.kt
|
|
// version: v1
|
|
inline fun foo(l: () -> Unit) {
|
|
l()
|
|
}
|
|
// version: v2
|
|
inline fun foo(noinline l: () -> Unit) {
|
|
l()
|
|
}
|
|
|
|
// MODULE: other
|
|
// FILE: other.kt
|
|
// compile("lib:v1")
|
|
fun test() {
|
|
foo {
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
// MODULE: app
|
|
// compile("other")
|
|
// compile("lib:v2")
|
|
fun main() {
|
|
test() // Will it link?
|
|
}
|
|
```
|
|
|