[JS IR] Update IC depends graph after intrinsics loading

- Remove unused params from compilerWithIC wrapper.
- Move JsIrBackendContext creation logic into separate function
- Introduce and use compiler interface for IC infrastructure

On dirty rebuild we may reload IR from stdlib,
such reloading may affect files with intrinsics and builtins.
As soon as we load only exported symbols, we must track dependencies
for files with intrinsics or builtins as for others.
This patch implements the logic which updates dependencies for
the stdlib files after loading of intrinsics and builtins.

^KT-54323 Fixed
This commit is contained in:
Alexander Korepanov
2022-10-12 22:14:15 +00:00
committed by Space Team
parent 31ba1f1534
commit 7b2c125754
40 changed files with 628 additions and 170 deletions
@@ -0,0 +1 @@
inline fun foo() = 0
@@ -0,0 +1,4 @@
inline fun foo() : Int {
val x: Any? = "1"
return x as Int
}
@@ -0,0 +1,4 @@
inline fun foo() : Int {
val x: Any? = null
return x!! as Int
}
@@ -0,0 +1,4 @@
inline fun foo() : Int {
throw NumberFormatException()
return 5
}
@@ -0,0 +1 @@
inline fun foo() = 6
@@ -0,0 +1,27 @@
STEP 0:
modifications:
U : l1.0.kt -> l1.kt
added file: l1.kt
STEP 1:
modifications:
U : l1.1.kt -> l1.kt
modified ir: l1.kt
STEP 2:
STEP 3:
modifications:
U : l1.3.8.kt -> l1.kt
modified ir: l1.kt
STEP 4:
STEP 5:
modifications:
U : l1.5.kt -> l1.kt
modified ir: l1.kt
STEP 6:
modifications:
U : l1.6.kt -> l1.kt
modified ir: l1.kt
STEP 7:
STEP 8:
modifications:
U : l1.3.8.kt -> l1.kt
modified ir: l1.kt
@@ -0,0 +1,3 @@
fun qux(): Int {
return foo()
}
@@ -0,0 +1,7 @@
fun qux(): Int {
try {
return foo()
} catch(ex: ClassCastException) {
return 2
}
}
@@ -0,0 +1,7 @@
fun qux(): Int {
try {
return foo()
} catch(ex: NullPointerException) {
return 4
}
}
@@ -0,0 +1,3 @@
fun qux(): Int {
return foo() + 1
}
@@ -0,0 +1,32 @@
STEP 0:
dependencies: lib1
modifications:
U : l2.0.kt -> l2.kt
added file: l2.kt
STEP 1:
dependencies: lib1
updated imports: l2.kt
STEP 2:
dependencies: lib1
modifications:
U : l2.2.kt -> l2.kt
modified ir: l2.kt
STEP 3:
dependencies: lib1
updated imports: l2.kt
STEP 4:
dependencies: lib1
modifications:
U : l2.4.kt -> l2.kt
modified ir: l2.kt
STEP 5..6:
dependencies: lib1
updated imports: l2.kt
STEP 7:
dependencies: lib1
modifications:
U : l2.7.kt -> l2.kt
modified ir: l2.kt
STEP 8:
dependencies: lib1
updated imports: l2.kt
@@ -0,0 +1,15 @@
fun box(stepId: Int): String {
when (stepId) {
0, 2, 4, 6, 7 -> if (qux() != stepId) return "Fail"
1, 3, 5, 8 -> {
try {
val r = qux()
return "Fail, got $r"
} catch (e: Exception) {
}
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,5 @@
STEP 0:
dependencies: lib1, lib2
added file: m.kt
STEP 1..8:
dependencies: lib1, lib2
@@ -0,0 +1,26 @@
MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js: lib1, lib2, main
STEP 1:
libs: lib1, lib2, main
dirty js: lib1, lib2
STEP 2:
libs: lib1, lib2, main
dirty js: lib1, lib2, main
STEP 3:
libs: lib1, lib2, main
dirty js: lib1, lib2
STEP 4:
libs: lib1, lib2, main
dirty js: lib2, main
STEP 5..6:
libs: lib1, lib2, main
dirty js: lib1, lib2
STEP 7:
libs: lib1, lib2, main
dirty js: lib2
STEP 8:
libs: lib1, lib2, main
dirty js: lib1, lib2