aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Hashable.scala
diff options
context:
space:
mode:
authorGuillaume Martres <smarter@ubuntu.com>2016-03-11 16:59:16 +0100
committerGuillaume Martres <smarter@ubuntu.com>2016-03-11 23:36:38 +0100
commita4597c4e2e664f744eeb68541ddbab997afc03cc (patch)
treed97b447155965ceeb81ea5a0c16778bb5ba86b6c /src/dotty/tools/dotc/core/Hashable.scala
parent305a9f06bd2b2ac6070beb184d61ff6db4cb9155 (diff)
downloaddotty-a4597c4e2e664f744eeb68541ddbab997afc03cc.tar.gz
dotty-a4597c4e2e664f744eeb68541ddbab997afc03cc.tar.bz2
dotty-a4597c4e2e664f744eeb68541ddbab997afc03cc.zip
Fix incorrect hashing leading to cache pollution
Before this commit, Hashable#addDelta did not work correctly when the input hash was the special value NotCached, instead of returning NotCached, it returned NotCached + delta. This means that many different values ended up being cached with the same hash when they should not be cached at all, this is especially bad since our HashSet implementation uses open addressing. I noticed this bug while working on a phase to collect API information for sbt (this phase needs to collect every member of a class, including inherited members), after enabling it, the compileStdLib test took ~500 seconds to complete, this commit reduces this to ~100 seconds.
Diffstat (limited to 'src/dotty/tools/dotc/core/Hashable.scala')
-rw-r--r--src/dotty/tools/dotc/core/Hashable.scala4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Hashable.scala b/src/dotty/tools/dotc/core/Hashable.scala
index 6a64f8655..12a408fbd 100644
--- a/src/dotty/tools/dotc/core/Hashable.scala
+++ b/src/dotty/tools/dotc/core/Hashable.scala
@@ -92,7 +92,9 @@ trait Hashable {
protected final def doHash(x1: Int, x2: Int): Int =
finishHash(hashing.mix(hashing.mix(hashSeed, x1), x2), 1)
- protected final def addDelta(hc: Int, delta: Int) = avoidNotCached(hc + delta)
+ protected final def addDelta(elemHash: Int, delta: Int) =
+ if (elemHash == NotCached) NotCached
+ else avoidNotCached(elemHash + delta)
private def avoidNotCached(h: Int) = if (h == NotCached) NotCachedAlt else h
}