summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Varming <cvarming@twitter.com>2016-07-20 23:57:35 -0400
committerCarsten Varming <cvarming@twitter.com>2016-07-21 10:12:02 -0400
commit9a2486087a9739108265e7830ebaa96373605d02 (patch)
treeb8d04cc64768863dcea4fe62ce02721fbac210fc
parent6b99dfe746cbb76828db495b58e55db2a0265ee2 (diff)
downloadscala-9a2486087a9739108265e7830ebaa96373605d02.tar.gz
scala-9a2486087a9739108265e7830ebaa96373605d02.tar.bz2
scala-9a2486087a9739108265e7830ebaa96373605d02.zip
SI-8774 Null link fields in mutable hash maps on removal.
-rw-r--r--src/library/scala/collection/mutable/HashTable.scala5
-rw-r--r--src/library/scala/collection/mutable/LinkedHashMap.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashSet.scala2
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
}
}