diff options
author | Stefan Zeiger <szeiger@novocode.com> | 2016-07-22 14:23:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-22 14:23:15 +0200 |
commit | b6812321be6686d17774db42a98c9aca869b51d5 (patch) | |
tree | e308ddee9a8de02e6cc18d87831fe4778f19ad3f /src | |
parent | 1a3a6127bf03891a2dc8fb2dfd4b270d1bc39ff9 (diff) | |
parent | 9a2486087a9739108265e7830ebaa96373605d02 (diff) | |
download | scala-b6812321be6686d17774db42a98c9aca869b51d5.tar.gz scala-b6812321be6686d17774db42a98c9aca869b51d5.tar.bz2 scala-b6812321be6686d17774db42a98c9aca869b51d5.zip |
Merge pull request #5295 from varming/cvarming/nepotism
SI-8774 Null link fields in mutable LinkedHashMap (and friends) on remove
Diffstat (limited to 'src')
-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 } } |