diff options
author | Rex Kerr <ichoran@gmail.com> | 2014-02-13 19:37:14 -0800 |
---|---|---|
committer | Rex Kerr <ichoran@gmail.com> | 2014-02-14 05:29:36 -0800 |
commit | a4a13199d0811d01cb008804ae34c594abdc415e (patch) | |
tree | 3ab9a2a58a80fb0c0e66b665fca83b1a78cae598 | |
parent | c83e01d47d941265fa5415c0f29a884c904fdfa0 (diff) | |
download | scala-a4a13199d0811d01cb008804ae34c594abdc415e.tar.gz scala-a4a13199d0811d01cb008804ae34c594abdc415e.tar.bz2 scala-a4a13199d0811d01cb008804ae34c594abdc415e.zip |
SI-8188 NPE during deserialization of TrieMap
The writer was using the constructor headf and ef instead of the internal vars hashingobj and equalityobj.
-rw-r--r-- | src/library/scala/collection/concurrent/TrieMap.scala | 4 | ||||
-rw-r--r-- | test/files/run/t8188.scala | 25 |
2 files changed, 27 insertions, 2 deletions
diff --git a/src/library/scala/collection/concurrent/TrieMap.scala b/src/library/scala/collection/concurrent/TrieMap.scala index 6632f30e51..fccc1d81b9 100644 --- a/src/library/scala/collection/concurrent/TrieMap.scala +++ b/src/library/scala/collection/concurrent/TrieMap.scala @@ -655,8 +655,8 @@ extends scala.collection.concurrent.Map[K, V] /* internal methods */ private def writeObject(out: java.io.ObjectOutputStream) { - out.writeObject(hashf) - out.writeObject(ef) + out.writeObject(hashingobj) + out.writeObject(equalityobj) val it = iterator while (it.hasNext) { diff --git a/test/files/run/t8188.scala b/test/files/run/t8188.scala new file mode 100644 index 0000000000..ec3a968e4a --- /dev/null +++ b/test/files/run/t8188.scala @@ -0,0 +1,25 @@ +object Test { + def main(args: Array[String]) { + import java.io.ByteArrayInputStream + import java.io.ByteArrayOutputStream + import java.io.ObjectInputStream + import java.io.ObjectOutputStream + import scala.collection.concurrent.TrieMap + + def ser[T](o: T): Array[Byte] = { + val baos = new ByteArrayOutputStream() + new ObjectOutputStream(baos).writeObject(o) + baos.toByteArray() + } + + def deser[T](bs: Array[Byte]): T = + new ObjectInputStream(new ByteArrayInputStream(bs)).readObject().asInstanceOf[T] + + def cloneViaSerialization[T](t: T): T = deser(ser(t)) + + val f = cloneViaSerialization(_: TrieMap[Int, Int]) + val tm = TrieMap(1 -> 2) + assert( f(f(tm)) == tm ) + assert( ser(tm).length == ser(f(tm)).length ) + } +} |