From 96b5bb1b311d359fcb7a251ec0ed43cf4ea48490 Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Fri, 13 Jul 2018 14:33:30 +0300 Subject: [PATCH] Fixed JVM Serialization problems: * EmptyCoroutineContext readResolve fixed * CombinedContext.writeReplace serializes all context elements --- .../src/kotlin/coroutines/CoroutineContextImpl.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libraries/stdlib/coroutines/src/kotlin/coroutines/CoroutineContextImpl.kt b/libraries/stdlib/coroutines/src/kotlin/coroutines/CoroutineContextImpl.kt index 59426749fd0..df4793b5e53 100644 --- a/libraries/stdlib/coroutines/src/kotlin/coroutines/CoroutineContextImpl.kt +++ b/libraries/stdlib/coroutines/src/kotlin/coroutines/CoroutineContextImpl.kt @@ -22,7 +22,7 @@ public abstract class AbstractCoroutineContextElement(public override val key: K @SinceKotlin("1.3") public object EmptyCoroutineContext : CoroutineContext, Serializable { private const val serialVersionUID: Long = 0 - private fun readResolve(): Any = this + private fun readResolve(): Any = EmptyCoroutineContext public override fun get(key: Key): E? = null public override fun fold(initial: R, operation: (R, Element) -> R): R = initial @@ -104,11 +104,13 @@ internal class CombinedContext( } + "]" private fun writeReplace(): Any { - val list = ArrayList(size()) - fold(Unit) { _, element -> - if (element is Serializable) list += element - } - return Serialized(list.toTypedArray()) + val n = size() + val elements = arrayOfNulls(n) + var index = 0 + fold(Unit) { _, element -> elements[index++] = element } + check(index == n) + @Suppress("UNCHECKED_CAST") + return Serialized(elements as Array) } private class Serialized(val elements: Array) : Serializable {