diff options
author | Adriaan Moors <adriaan@lightbend.com> | 2017-03-10 09:27:23 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-10 09:27:23 -0800 |
commit | 680d8661420a6ae4d0c1d9d46145d2b815255ef3 (patch) | |
tree | 6fe27d3ce9c6e51ebc4725a8b7513ae2503212d8 /src/library/scala | |
parent | 0e38f28e339740d573c87c48c8854ce2085767f8 (diff) | |
parent | 898fa00a76286786427b093f0161ea0d3d3bae29 (diff) | |
download | scala-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.scala | 12 |
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 */ |