ba933fa887
Revert changes for "tolerant to uninitialized values" in OptimizationBasicInterpreter: this approach doesn't converge for some specific cases where local variable is reused (e.g., in several inlined functions - see https://youtrack.jetbrains.com/issue/KT-15112). Instead, treat fake always-false conditional jump in the beginning of the post-condition loop as a "reference point" for stack on loop break / continue. This requires an extra abstraction layer in FixStackAnalyzer, since we can't perform fine-grain manipulations on Frames (such as "combine frame C from local variables of frame A and stack of frame B"). NB additional NOPs will be generated for post-condition loops. Should make a separate bytecode postprocessing pass to get rid of unnecessary NOPs (several YT issues for perceived quality of the generated bytecode are about such NOPs).
29 lines
594 B
Kotlin
Vendored
29 lines
594 B
Kotlin
Vendored
// FULL_JDK
|
|
// WITH_RUNTIME
|
|
// IGNORE_BACKEND: JS
|
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock
|
|
import kotlin.concurrent.read
|
|
import kotlin.concurrent.write
|
|
|
|
private val evalStateLock = ReentrantReadWriteLock()
|
|
private val classLoaderLock = ReentrantReadWriteLock()
|
|
val compiledClasses = arrayListOf("")
|
|
|
|
fun box(): String = evalStateLock.write {
|
|
classLoaderLock.read {
|
|
classLoaderLock.write {
|
|
"write"
|
|
}
|
|
|
|
compiledClasses.forEach {
|
|
it
|
|
}
|
|
}
|
|
|
|
classLoaderLock.read {
|
|
compiledClasses.map { it }
|
|
}
|
|
|
|
"OK"
|
|
} |