-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Codeviewer. Crash on Ubuntu #991
Comments
Similar issue in Google tracker: |
The same on Windows. No logical steps to reproduce constantly, it just crashes from time to time. |
@igordmn Any news with this kind of trouble? Maybe there are some suggestions on when to expect and how to avoid it? |
Unfortunately, no. To fix this issue, we need to make a minimal reliable reproducer, using only |
@igordmn One more thing. The exception happens on Windows in my case. On Mac everything is fine. |
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 see eclipse-openj9/openj9#3062 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` The crash: ``` Caused by: java.lang.IllegalStateException: pending composition has not been applied at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:448) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:635) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:793) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:106) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:460) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:426) at androidx.compose.desktop.examples.example1.TestClock.withFrameNanos(Main.jvm.kt:85) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend(Recomposer.kt:426) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:853) ``` The reproducer: ``` import androidx.compose.runtime.AbstractApplier import androidx.compose.runtime.Composable import androidx.compose.runtime.Composition import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MonotonicFrameClock import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.withRunningRecomposer import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.yield import java.util.concurrent.Executors.newSingleThreadExecutor import kotlin.random.Random fun main() { runBlocking(newSingleThreadExecutor().asCoroutineDispatcher() + TestClock) { repeat(300) { num -> println("test $num") withRunningRecomposer { val composition = Composition(TestApplier, it) composition.setContent { val scope = currentRecomposeScope Test(Random.nextInt()) Test(Random.nextInt()) LaunchedEffect(Unit) { scope.invalidate() } } yield() yield() } } } } @composable fun Test(test: Int) { val latestContent = rememberUpdatedState(test) latestContent.value val parent = rememberCompositionContext() LaunchedEffect(Unit) { val composition1 = Composition(TestApplier, parent) composition1.setContent { latestContent.value } val composition2 = Composition(TestApplier, parent) composition2.setContent { latestContent.value } } } internal object TestApplier: AbstractApplier<Unit>(Unit) { override fun insertTopDown(index: Int, instance: Unit) = Unit override fun insertBottomUp(index: Int, instance: Unit) = Unit override fun remove(index: Int, count: Int) = Unit override fun move(from: Int, to: Int, count: Int) = Unit override fun onClear() = Unit } object TestClock : MonotonicFrameClock { override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R { return onFrame(System.nanoTime()) } } ``` java --version: ``` openjdk 15.0.2 2021-01-19 OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.2+7) Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 15 Linux amd64-64-Bit Compressed References 20210121_172 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - 863b523566 based on jdk-15.0.2+7) ``` OS: Ubuntu 20.0.4 Test: manual (see the reproducer) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK)
Should be fixed in 1.0.0-beta6-dev474 |
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 see eclipse-openj9/openj9#3062 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` The crash: ``` Caused by: java.lang.IllegalStateException: pending composition has not been applied at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:448) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:635) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:793) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:106) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:460) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:426) at androidx.compose.desktop.examples.example1.TestClock.withFrameNanos(Main.jvm.kt:85) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend(Recomposer.kt:426) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:853) ``` The reproducer: ``` import androidx.compose.runtime.AbstractApplier import androidx.compose.runtime.Composable import androidx.compose.runtime.Composition import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MonotonicFrameClock import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.withRunningRecomposer import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.yield import java.util.concurrent.Executors.newSingleThreadExecutor import kotlin.random.Random fun main() { runBlocking(newSingleThreadExecutor().asCoroutineDispatcher() + TestClock) { repeat(300) { num -> println("test $num") withRunningRecomposer { val composition = Composition(TestApplier, it) composition.setContent { val scope = currentRecomposeScope Test(Random.nextInt()) Test(Random.nextInt()) LaunchedEffect(Unit) { scope.invalidate() } } yield() yield() } } } } @composable fun Test(test: Int) { val latestContent = rememberUpdatedState(test) latestContent.value val parent = rememberCompositionContext() LaunchedEffect(Unit) { val composition1 = Composition(TestApplier, parent) composition1.setContent { latestContent.value } val composition2 = Composition(TestApplier, parent) composition2.setContent { latestContent.value } } } internal object TestApplier: AbstractApplier<Unit>(Unit) { override fun insertTopDown(index: Int, instance: Unit) = Unit override fun insertBottomUp(index: Int, instance: Unit) = Unit override fun remove(index: Int, count: Int) = Unit override fun move(from: Int, to: Int, count: Int) = Unit override fun onClear() = Unit } object TestClock : MonotonicFrameClock { override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R { return onFrame(System.nanoTime()) } } ``` java --version: ``` openjdk 15.0.2 2021-01-19 OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.2+7) Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 15 Linux amd64-64-Bit Compressed References 20210121_172 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - 863b523566 based on jdk-15.0.2+7) ``` OS: Ubuntu 20.0.4 Test: manual (see the reproducer) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK)
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 see eclipse-openj9/openj9#3062 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` The crash: ``` Caused by: java.lang.IllegalStateException: pending composition has not been applied at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:448) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:635) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:793) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:106) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:460) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:426) at androidx.compose.desktop.examples.example1.TestClock.withFrameNanos(Main.jvm.kt:85) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend(Recomposer.kt:426) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:853) ``` The reproducer: ``` import androidx.compose.runtime.AbstractApplier import androidx.compose.runtime.Composable import androidx.compose.runtime.Composition import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MonotonicFrameClock import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.withRunningRecomposer import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.yield import java.util.concurrent.Executors.newSingleThreadExecutor import kotlin.random.Random fun main() { runBlocking(newSingleThreadExecutor().asCoroutineDispatcher() + TestClock) { repeat(300) { num -> println("test $num") withRunningRecomposer { val composition = Composition(TestApplier, it) composition.setContent { val scope = currentRecomposeScope Test(Random.nextInt()) Test(Random.nextInt()) LaunchedEffect(Unit) { scope.invalidate() } } yield() yield() } } } } @composable fun Test(test: Int) { val latestContent = rememberUpdatedState(test) latestContent.value val parent = rememberCompositionContext() LaunchedEffect(Unit) { val composition1 = Composition(TestApplier, parent) composition1.setContent { latestContent.value } val composition2 = Composition(TestApplier, parent) composition2.setContent { latestContent.value } } } internal object TestApplier: AbstractApplier<Unit>(Unit) { override fun insertTopDown(index: Int, instance: Unit) = Unit override fun insertBottomUp(index: Int, instance: Unit) = Unit override fun remove(index: Int, count: Int) = Unit override fun move(from: Int, to: Int, count: Int) = Unit override fun onClear() = Unit } object TestClock : MonotonicFrameClock { override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R { return onFrame(System.nanoTime()) } } ``` java --version: ``` openjdk 15.0.2 2021-01-19 OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.2+7) Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 15 Linux amd64-64-Bit Compressed References 20210121_172 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - 863b523566 based on jdk-15.0.2+7) ``` OS: Ubuntu 20.0.4 Test: manual (see the reproducer) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK)
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 see eclipse-openj9/openj9#3062 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` The crash: ``` Caused by: java.lang.IllegalStateException: pending composition has not been applied at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:448) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:635) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:793) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:106) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:460) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:426) at androidx.compose.desktop.examples.example1.TestClock.withFrameNanos(Main.jvm.kt:85) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend(Recomposer.kt:426) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:853) ``` The reproducer: ``` import androidx.compose.runtime.AbstractApplier import androidx.compose.runtime.Composable import androidx.compose.runtime.Composition import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MonotonicFrameClock import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.withRunningRecomposer import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.yield import java.util.concurrent.Executors.newSingleThreadExecutor import kotlin.random.Random fun main() { runBlocking(newSingleThreadExecutor().asCoroutineDispatcher() + TestClock) { repeat(300) { num -> println("test $num") withRunningRecomposer { val composition = Composition(TestApplier, it) composition.setContent { val scope = currentRecomposeScope Test(Random.nextInt()) Test(Random.nextInt()) LaunchedEffect(Unit) { scope.invalidate() } } yield() yield() } } } } @composable fun Test(test: Int) { val latestContent = rememberUpdatedState(test) latestContent.value val parent = rememberCompositionContext() LaunchedEffect(Unit) { val composition1 = Composition(TestApplier, parent) composition1.setContent { latestContent.value } val composition2 = Composition(TestApplier, parent) composition2.setContent { latestContent.value } } } internal object TestApplier: AbstractApplier<Unit>(Unit) { override fun insertTopDown(index: Int, instance: Unit) = Unit override fun insertBottomUp(index: Int, instance: Unit) = Unit override fun remove(index: Int, count: Int) = Unit override fun move(from: Int, to: Int, count: Int) = Unit override fun onClear() = Unit } object TestClock : MonotonicFrameClock { override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R { return onFrame(System.nanoTime()) } } ``` java --version: ``` openjdk 15.0.2 2021-01-19 OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.2+7) Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 15 Linux amd64-64-Bit Compressed References 20210121_172 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - 863b523566 based on jdk-15.0.2+7) ``` OS: Ubuntu 20.0.4 Test: manual (see the reproducer) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK)
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 see eclipse-openj9/openj9#3062 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` The crash: ``` Caused by: java.lang.IllegalStateException: pending composition has not been applied at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:448) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:635) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:793) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:106) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:460) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:426) at androidx.compose.desktop.examples.example1.TestClock.withFrameNanos(Main.jvm.kt:85) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend(Recomposer.kt:426) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:853) ``` The reproducer: ``` import androidx.compose.runtime.AbstractApplier import androidx.compose.runtime.Composable import androidx.compose.runtime.Composition import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MonotonicFrameClock import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.withRunningRecomposer import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.yield import java.util.concurrent.Executors.newSingleThreadExecutor import kotlin.random.Random fun main() { runBlocking(newSingleThreadExecutor().asCoroutineDispatcher() + TestClock) { repeat(300) { num -> println("test $num") withRunningRecomposer { val composition = Composition(TestApplier, it) composition.setContent { val scope = currentRecomposeScope Test(Random.nextInt()) Test(Random.nextInt()) LaunchedEffect(Unit) { scope.invalidate() } } yield() yield() } } } } @composable fun Test(test: Int) { val latestContent = rememberUpdatedState(test) latestContent.value val parent = rememberCompositionContext() LaunchedEffect(Unit) { val composition1 = Composition(TestApplier, parent) composition1.setContent { latestContent.value } val composition2 = Composition(TestApplier, parent) composition2.setContent { latestContent.value } } } internal object TestApplier: AbstractApplier<Unit>(Unit) { override fun insertTopDown(index: Int, instance: Unit) = Unit override fun insertBottomUp(index: Int, instance: Unit) = Unit override fun remove(index: Int, count: Int) = Unit override fun move(from: Int, to: Int, count: Int) = Unit override fun onClear() = Unit } object TestClock : MonotonicFrameClock { override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R { return onFrame(System.nanoTime()) } } ``` java --version: ``` openjdk 15.0.2 2021-01-19 OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.2+7) Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.24.0, JRE 15 Linux amd64-64-Bit Compressed References 20210121_172 (JIT enabled, AOT enabled) OpenJ9 - 345e1b09e OMR - 741e94ea8 JCL - 863b523566 based on jdk-15.0.2+7) ``` OS: Ubuntu 20.0.4 Test: manual (see the reproducer) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK)
(adding this information for history) The reproducer:
Reproduces only on Eclipse OpenJ9, Ubuntu:
The issue was because identityHashCode on OpenJ9 returns negative values (issue) |
Fixes JetBrains/compose-multiplatform#991 Eclipse OpenJ9 can return negative hashcodes (at least 15.0.2): -1366493741 192407236 when we compare them, we can catch an overflow: `-1366493741 - 1924072363` will be more than 0 That leads to wrong behaviour of IdentityArraySet, and so of Recomposer: ``` alreadyComposed.add(composition) println(alreadyComposed.contains(composition)) // will print `false` ``` Test: manual (see the reproducer in JetBrains/compose-multiplatform#991 (comment)) Test: ./gradlew :compose:runtime:runtime:test (without the fix we have failing Identity*Test on this JDK) Change-Id: Iedfe50d70121a88b16171b15e089fcd8de2e99c9
This seems to have come back with the iOS alpha. Could it be a similar issue? This was recorded on iOS 17.1.2 on an iPhone 15 Pro Max. I believe the Compose version was 1.6.0-dev1296.
|
@zacharee Can you post a short snipped where this is reproduced? |
This is from a crash report on Bugsnag, so I don't know exactly how to reproduce it. This is the code, though: https://github.com/zacharee/ArcadyanKVD21Control/blob/727ce98524e71a056098dd9af67d5c278a835bf0/common/src/commonMain/kotlin/dev/zwander/common/components/PageGrid.kt. |
Unfortunately there's not much we can do without a reproducer here. |
Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks. |
Ubuntu 20.04.2 LTS, Gnome 3.36.8, X11
(stacktrace in 1.0.0-alpha1-rc5)
(stacktrace in 0.4.0-build208)
0.4.0-build208 + Kotlin 1.5.0 - crash happens
0.4.0-build190 + Kotlin 1.4.32 - crash doesn't happen
The text was updated successfully, but these errors were encountered: