summaryrefslogtreecommitdiff
path: root/src/library/scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2017-03-10 09:27:23 -0800
committerGitHub <noreply@github.com>2017-03-10 09:27:23 -0800
commit680d8661420a6ae4d0c1d9d46145d2b815255ef3 (patch)
tree6fe27d3ce9c6e51ebc4725a8b7513ae2503212d8 /src/library/scala
parent0e38f28e339740d573c87c48c8854ce2085767f8 (diff)
parent898fa00a76286786427b093f0161ea0d3d3bae29 (diff)
downloadscala-680d8661420a6ae4d0c1d9d46145d2b815255ef3.tar.gz
scala-680d8661420a6ae4d0c1d9d46145d2b815255ef3.tar.bz2
scala-680d8661420a6ae4d0c1d9d46145d2b815255ef3.zip
Merge pull request #5719 from retronym/ticket/10187
SI-10187 Support mutation of mutable.HashMap in getOrElseUpdate
Diffstat (limited to 'src/library/scala')
-rw-r--r--src/library/scala/collection/mutable/HashMap.scala12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala
index 11ff1f0893..de61ebb796 100644
--- a/src/library/scala/collection/mutable/HashMap.scala
+++ b/src/library/scala/collection/mutable/HashMap.scala
@@ -73,10 +73,18 @@ extends AbstractMap[A, B]
}
override def getOrElseUpdate(key: A, defaultValue: => B): B = {
- val i = index(elemHashCode(key))
+ val hash = elemHashCode(key)
+ val i = index(hash)
val entry = findEntry(key, i)
if (entry != null) entry.value
- else addEntry(createNewEntry(key, defaultValue), i)
+ else {
+ val table0 = table
+ val default = defaultValue
+ // Avoid recomputing index if the `defaultValue()` hasn't triggered
+ // a table resize.
+ val newEntryIndex = if (table0 eq table) i else index(hash)
+ addEntry(createNewEntry(key, default), newEntryIndex)
+ }
}
/* inlined HashTable.findEntry0 to preserve its visibility */