Fix processing of uninitialized instances for coroutines

The problem is that code in the attached test led to VerifyError at runtime
because the Bar's uninitialized instance created in 'map' was being stored
to the field (leaked from the JVM point of view).

The actual problem was that after repeating visiting of NEW operation
we used to drop the set of already visited copy usages.

For clarification see the comment before 'processUninitializedStores'

 #KT-15016 Fixed
This commit is contained in:
Denis Zharkov
2017-01-17 16:04:32 +03:00
parent 630fab1952
commit 37b364a70a
7 changed files with 127 additions and 1 deletions
+47
View File
@@ -0,0 +1,47 @@
// WITH_RUNTIME
// WITH_COROUTINES
import kotlin.coroutines.intrinsics.SUSPENDED_MARKER
import kotlin.coroutines.intrinsics.suspendCoroutineOrReturn
import kotlin.coroutines.startCoroutine
class Bar(val x: Any)
inline fun Any.map(transform: (Any) -> Any) {
when (this) {
is Foo -> Bar(transform(value))
}
}
class Foo(val value: Any) {
companion object {
inline fun of(f: () -> Unit): Any = try {
Foo(f())
} catch(ex: Exception) {
Foo(Unit)
}
}
}
suspend fun suspendHere(): String = suspendCoroutineOrReturn { x ->
x.resume("OK")
SUSPENDED_MARKER
}
fun builder(c: suspend () -> Unit) {
c.startCoroutine(EmptyContinuation)
}
fun box(): String {
var result = ""
builder {
Foo.of {
}.map {
result = suspendHere()
Unit
}
}
return result
}
@@ -0,0 +1,55 @@
@kotlin.Metadata
public final class Bar {
private final @org.jetbrains.annotations.NotNull field x: java.lang.Object
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public final @org.jetbrains.annotations.NotNull method getX(): java.lang.Object
}
@kotlin.Metadata
public final class CoroutineUtilKt {
public final static @org.jetbrains.annotations.NotNull method handleExceptionContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
public final static @org.jetbrains.annotations.NotNull method handleResultContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
}
@kotlin.Metadata
public class EmptyContinuation {
public final static field Companion: EmptyContinuation.Companion
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.CoroutineContext
inner class EmptyContinuation/Companion
public @synthetic.kotlin.jvm.GeneratedByJvmOverloads method <init>(): void
public method <init>(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.CoroutineContext): void
public synthetic method <init>(p0: kotlin.coroutines.CoroutineContext, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public method resume(@org.jetbrains.annotations.Nullable p0: java.lang.Object): void
public method resumeWithException(@org.jetbrains.annotations.NotNull p0: java.lang.Throwable): void
}
@kotlin.Metadata
public final static class EmptyContinuation/Companion {
inner class EmptyContinuation/Companion
private method <init>(): void
}
@kotlin.Metadata
public final class Foo {
public final static field Companion: Foo.Companion
private final @org.jetbrains.annotations.NotNull field value: java.lang.Object
inner class Foo/Companion
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public final @org.jetbrains.annotations.NotNull method getValue(): java.lang.Object
}
@kotlin.Metadata
public final static class Foo/Companion {
inner class Foo/Companion
private method <init>(): void
public final @org.jetbrains.annotations.NotNull method of(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function0): java.lang.Object
}
@kotlin.Metadata
public final class Kt15016Kt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void
public final static method map(@org.jetbrains.annotations.NotNull p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.jvm.functions.Function1): void
public final static @org.jetbrains.annotations.Nullable method suspendHere(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object
}