[JS IR] Use a copy of an original inline function for inlining
If inline function A calls another inline function B, we must use the original version of inline function A for inlining, which doesn’t have inlined function B. Because during the inlining process, we remap all occurrences of inline function A to a temporary copy of function A, and if the function B somehow uses function A (e.g. callable reference), the built IR will have a reference to the temporary function, not the original one. All these things lead to broken cross-module references. This patch saves the original versions of all inline functions before inlining and provides them during the inline process. ^KT-55930 Fixed
This commit is contained in:
committed by
Space Team
parent
82d934d873
commit
a5c8e30bb1
@@ -0,0 +1,24 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
// MODULE: lib
|
||||
// FILE: A.kt
|
||||
inline fun funA(flag: Boolean): String {
|
||||
if (flag) {
|
||||
return funB(flag)
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
// FILE: B.kt
|
||||
inline fun funB(flag: Boolean): String {
|
||||
val f = ::funA
|
||||
if (flag) {
|
||||
return f(false)
|
||||
}
|
||||
return "NOT OK"
|
||||
}
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: main.kt
|
||||
fun box(): String {
|
||||
return funA(true)
|
||||
}
|
||||
Reference in New Issue
Block a user