From 628eaa5aca0117823327571a1384f0d717fd7b4e Mon Sep 17 00:00:00 2001 From: Aleksandar Prokopec Date: Fri, 4 May 2012 10:46:29 +0200 Subject: Fix for si-5018. Methods keySet, values and withDefault now return serializable collections. --- src/library/scala/collection/Map.scala | 2 +- src/library/scala/collection/MapLike.scala | 4 ++-- test/files/run/t5018.scala | 37 ++++++++++++++++++++++++++++++ test/pending/run/t5018.scala | 34 --------------------------- 4 files changed, 40 insertions(+), 37 deletions(-) create mode 100644 test/files/run/t5018.scala delete mode 100644 test/pending/run/t5018.scala diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala index a124e60c96..42a56a9c5a 100644 --- a/src/library/scala/collection/Map.scala +++ b/src/library/scala/collection/Map.scala @@ -45,7 +45,7 @@ object Map extends MapFactory[Map] { /** An abstract shell used by { mutable, immutable }.Map but not by collection.Map * because of variance issues. */ - abstract class WithDefault[A, +B](underlying: Map[A, B], d: A => B) extends AbstractMap[A, B] with Map[A, B] { + abstract class WithDefault[A, +B](underlying: Map[A, B], d: A => B) extends AbstractMap[A, B] with Map[A, B] with Serializable { override def size = underlying.size def get(key: A) = underlying.get(key) // removed in 2.9: orElse Some(default(key)) def iterator = underlying.iterator diff --git a/src/library/scala/collection/MapLike.scala b/src/library/scala/collection/MapLike.scala index 034c1a0c0c..b2b687e75a 100644 --- a/src/library/scala/collection/MapLike.scala +++ b/src/library/scala/collection/MapLike.scala @@ -165,7 +165,7 @@ self => /** The implementation class of the set returned by `keySet`. */ - protected class DefaultKeySet extends AbstractSet[A] with Set[A] { + protected class DefaultKeySet extends AbstractSet[A] with Set[A] with Serializable { def contains(key : A) = self.contains(key) def iterator = keysIterator def + (elem: A): Set[A] = (Set[A]() ++ this + elem).asInstanceOf[Set[A]] // !!! concrete overrides abstract problem @@ -200,7 +200,7 @@ self => /** The implementation class of the iterable returned by `values`. */ - protected class DefaultValuesIterable extends AbstractIterable[B] with Iterable[B] { + protected class DefaultValuesIterable extends AbstractIterable[B] with Iterable[B] with Serializable { def iterator = valuesIterator override def size = self.size override def foreach[C](f: B => C) = self.valuesIterator foreach f diff --git a/test/files/run/t5018.scala b/test/files/run/t5018.scala new file mode 100644 index 0000000000..bb67a252e5 --- /dev/null +++ b/test/files/run/t5018.scala @@ -0,0 +1,37 @@ + + + +import java.io._ +import collection._ + + + +object Test { + + def serializeDeserialize[T <: AnyRef](obj: T) = { + val buffer = new ByteArrayOutputStream + val out = new ObjectOutputStream(buffer) + out.writeObject(obj) + val in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray)) + in.readObject.asInstanceOf[T] + } + + def main(args: Array[String]) { + val values = mutable.Map(1 -> 1).values + assert(serializeDeserialize(values).toList == values.toList) + + val keyset = mutable.Map(1 -> 1).keySet + assert(serializeDeserialize(keyset) == keyset) + + val imkeyset = immutable.Map(1 -> 1).keySet + assert(serializeDeserialize(imkeyset) == imkeyset) + + val defaultmap = immutable.Map(1 -> 1).withDefaultValue(1) + assert(serializeDeserialize(defaultmap) == defaultmap) + + val minusmap = mutable.Map(1 -> 1).withDefault(x => -x) + assert(serializeDeserialize(minusmap) == minusmap) + } + +} + diff --git a/test/pending/run/t5018.scala b/test/pending/run/t5018.scala deleted file mode 100644 index 30c0d5ac94..0000000000 --- a/test/pending/run/t5018.scala +++ /dev/null @@ -1,34 +0,0 @@ - - - -import java.io._ -import collection._ - - - -object Test { - - def serializeDeserialize[T <: AnyRef](obj: T) = { - val buffer = new ByteArrayOutputStream - val out = new ObjectOutputStream(buffer) - out.writeObject(obj) - val in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray)) - in.readObject.asInstanceOf[T] - } - - def main(args: Array[String]) { - val values = mutable.Map(1 -> 1).values - assert(serializeDeserialize(values) == values) - - val keyset = mutable.Map(1 -> 1).keySet - assert(serializeDeserialize(keyset) == keyset) - - val imkeyset = immutable.Map(1 -> 1).keySet - assert(serializeDeserialize(imkeyset) == imkeyset) - - val defaultmap = immutable.Map(1 -> 1).withDefaultValue(1) - assert(serializeDeserialize(defaultmap) == defaultmap) - } - -} - -- cgit v1.2.3