diff options
author | Carsten Varming <cvarming@twitter.com> | 2016-07-20 23:57:35 -0400 |
---|---|---|
committer | Adriaan Moors <adriaan@lightbend.com> | 2017-01-05 13:27:04 -0800 |
commit | f31745ac9bc5d2fcad1ab52caf4a3b6169c7f9b4 (patch) | |
tree | 36e5ca19594e75207e6a991ab677fc993c32b651 /src/library/scala/collection | |
parent | cb7192c79f35e8b4c852f6859c9ef0cece173a36 (diff) | |
download | scala-f31745ac9bc5d2fcad1ab52caf4a3b6169c7f9b4.tar.gz scala-f31745ac9bc5d2fcad1ab52caf4a3b6169c7f9b4.tar.bz2 scala-f31745ac9bc5d2fcad1ab52caf4a3b6169c7f9b4.zip |
SI-8774 Null link fields in mutable hash maps on removal.
(cherry picked from commit 9a2486087a9739108265e7830ebaa96373605d02)
Diffstat (limited to 'src/library/scala/collection')
-rw-r--r-- | src/library/scala/collection/mutable/HashTable.scala | 5 | ||||
-rw-r--r-- | src/library/scala/collection/mutable/LinkedHashMap.scala | 2 | ||||
-rw-r--r-- | src/library/scala/collection/mutable/LinkedHashSet.scala | 2 |
3 files changed, 8 insertions, 1 deletions
diff --git a/src/library/scala/collection/mutable/HashTable.scala b/src/library/scala/collection/mutable/HashTable.scala index b48a32fa37..bb15788bdf 100644 --- a/src/library/scala/collection/mutable/HashTable.scala +++ b/src/library/scala/collection/mutable/HashTable.scala @@ -183,6 +183,7 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU table(h) = e.next tableSize = tableSize - 1 nnSizeMapRemove(h) + e.next = null return e } else { var e1 = e.next @@ -194,6 +195,7 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU e.next = e1.next tableSize = tableSize - 1 nnSizeMapRemove(h) + e1.next = null return e1 } } @@ -227,8 +229,9 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU var es = iterTable(idx) while (es != null) { + val next = es.next // Cache next in case f removes es. f(es.asInstanceOf[Entry]) - es = es.next + es = next while (es == null && idx > 0) { idx -= 1 diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala index 275f490675..a731b1bbdc 100644 --- a/src/library/scala/collection/mutable/LinkedHashMap.scala +++ b/src/library/scala/collection/mutable/LinkedHashMap.scala @@ -81,6 +81,8 @@ class LinkedHashMap[A, B] extends AbstractMap[A, B] else e.earlier.later = e.later if (e.later eq null) lastEntry = e.earlier else e.later.earlier = e.earlier + e.earlier = null // Null references to prevent nepotism + e.later = null Some(e.value) } } diff --git a/src/library/scala/collection/mutable/LinkedHashSet.scala b/src/library/scala/collection/mutable/LinkedHashSet.scala index 756a2f73c1..f00cbd90dc 100644 --- a/src/library/scala/collection/mutable/LinkedHashSet.scala +++ b/src/library/scala/collection/mutable/LinkedHashSet.scala @@ -73,6 +73,8 @@ class LinkedHashSet[A] extends AbstractSet[A] else e.earlier.later = e.later if (e.later eq null) lastEntry = e.earlier else e.later.earlier = e.earlier + e.earlier = null // Null references to prevent nepotism + e.later = null true } } |