Skip to content

Commit 0baf589

Browse files
committed
Make SimpleMaps eq-based
It's more efficient, and it also makes the logic in ProtoTypes#constrained independent of whether type lambdas are cached or uncached.
1 parent 442581d commit 0baf589

File tree

7 files changed

+42
-46
lines changed

7 files changed

+42
-46
lines changed

compiler/src/dotty/tools/dotc/core/Constraint.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dotc
33
package core
44

55
import Types._, Contexts._, Symbols._
6-
import util.SimpleMap
76
import collection.mutable
87
import printing.{Printer, Showable}
98
import printing.Texts._

compiler/src/dotty/tools/dotc/core/Names.scala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ import StdNames.str
1212
import Designators._
1313
import util.Chars.isIdentifierStart
1414
import collection.IndexedSeqOptimized
15-
import collection.generic.CanBuildFrom
16-
import collection.mutable.{ Builder, StringBuilder, AnyRefMap }
17-
import collection.immutable.WrappedString
18-
import collection.generic.CanBuildFrom
19-
import util.{DotClass, SimpleMap}
15+
import collection.immutable
16+
import util.{DotClass}
2017
import config.Config
2118
import java.util.HashMap
2219

@@ -193,24 +190,24 @@ object Names {
193190
def underlying: TermName = unsupported("underlying")
194191

195192
@sharable // because of synchronized block in `and`
196-
private var derivedNames: AnyRef /* SimpleMap | j.u.HashMap */ =
197-
SimpleMap.Empty[NameInfo]
193+
private var derivedNames: AnyRef /* immutable.Map[NameInfo, DerivedName] | j.u.HashMap */ =
194+
immutable.Map.empty[NameInfo, DerivedName]
198195

199196
private def getDerived(info: NameInfo): DerivedName /* | Null */= derivedNames match {
200-
case derivedNames: SimpleMap[NameInfo, DerivedName] @unchecked =>
201-
derivedNames(info)
197+
case derivedNames: immutable.AbstractMap[NameInfo, DerivedName] @unchecked =>
198+
if (derivedNames.contains(info)) derivedNames(info) else null
202199
case derivedNames: HashMap[NameInfo, DerivedName] @unchecked =>
203200
derivedNames.get(info)
204201
}
205202

206203
private def putDerived(info: NameInfo, name: DerivedName): name.type = {
207204
derivedNames match {
208-
case derivedNames: SimpleMap[NameInfo, DerivedName] @unchecked =>
205+
case derivedNames: immutable.Map[NameInfo, DerivedName] @unchecked =>
209206
if (derivedNames.size < 4)
210207
this.derivedNames = derivedNames.updated(info, name)
211208
else {
212209
val newMap = new HashMap[NameInfo, DerivedName]
213-
derivedNames.foreachBinding(newMap.put(_, _))
210+
derivedNames.foreach { case (k, v) => newMap.put(k, v) }
214211
newMap.put(info, name)
215212
this.derivedNames = newMap
216213
}

compiler/src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Types._, Contexts._, Symbols._, Flags._, Names._, NameOps._, Denotations.
66
import Decorators._
77
import StdNames.{nme, tpnme}
88
import collection.mutable
9-
import util.{Stats, DotClass, SimpleMap}
9+
import util.{Stats, DotClass}
1010
import config.Config
1111
import config.Printers.{typr, constr, subtyping, noPrinter}
1212
import TypeErasure.{erasedLub, erasedGlb}

compiler/src/dotty/tools/dotc/core/TypeOps.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import StdNames._
1313
import Annotations._
1414
import annotation.tailrec
1515
import config.Config
16-
import util.{SimpleMap, Property}
16+
import util.Property
1717
import collection.mutable
1818
import ast.tpd._
1919

compiler/src/dotty/tools/dotc/core/Types.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import Periods._
1919
import Designators._
2020
import util.Positions.{Position, NoPosition}
2121
import util.Stats._
22-
import util.{DotClass, SimpleMap}
22+
import util.DotClass
2323
import reporting.diagnostic.Message
2424
import reporting.diagnostic.messages.CyclicReferenceInvolving
2525
import ast.tpd._

compiler/src/dotty/tools/dotc/typer/Checking.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import ErrorReporting.errorTree
2121

2222
import annotation.unchecked
2323
import util.Positions._
24-
import util.{SimpleMap, Stats}
24+
import util.Stats
2525
import util.common._
2626
import transform.SymUtils._
2727
import Decorators._

compiler/src/dotty/tools/dotc/util/SimpleMap.scala

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ object SimpleMap {
4141
class Map1[K <: AnyRef, +V >: Null <: AnyRef] (k1: K, v1: V) extends SimpleMap[K, V] {
4242
def size = 1
4343
def apply(k: K) =
44-
if (k == k1) v1
44+
if (k eq k1) v1
4545
else null
4646
def remove(k: K) =
47-
if (k == k1) Empty.asInstanceOf[SimpleMap[K, V]]
47+
if (k eq k1) Empty.asInstanceOf[SimpleMap[K, V]]
4848
else this
4949
def updated[V1 >: V <: AnyRef](k: K, v: V1) =
50-
if (k == k1) new Map1(k, v)
50+
if (k eq k1) new Map1(k, v)
5151
else new Map2(k1, v1, k, v)
5252
def mapValuesNow[V1 >: V <: AnyRef](f: (K, V1) => V1) = {
5353
val w1 = f(k1, v1)
@@ -59,16 +59,16 @@ object SimpleMap {
5959
class Map2[K <: AnyRef, +V >: Null <: AnyRef] (k1: K, v1: V, k2: K, v2: V) extends SimpleMap[K, V] {
6060
def size = 2
6161
def apply(k: K) =
62-
if (k == k1) v1
63-
else if (k == k2) v2
62+
if (k eq k1) v1
63+
else if (k eq k2) v2
6464
else null
6565
def remove(k: K) =
66-
if (k == k1) new Map1(k2, v2)
67-
else if (k == k2) new Map1(k1, v1)
66+
if (k eq k1) new Map1(k2, v2)
67+
else if (k eq k2) new Map1(k1, v1)
6868
else this
6969
def updated[V1 >: V <: AnyRef](k: K, v: V1) =
70-
if (k == k1) new Map2(k, v, k2, v2)
71-
else if (k == k2) new Map2(k1, v1, k, v)
70+
if (k eq k1) new Map2(k, v, k2, v2)
71+
else if (k eq k2) new Map2(k1, v1, k, v)
7272
else new Map3(k1, v1, k2, v2, k, v)
7373
def mapValuesNow[V1 >: V <: AnyRef](f: (K, V1) => V1) = {
7474
val w1 = f(k1, v1); val w2 = f(k2, v2)
@@ -81,19 +81,19 @@ object SimpleMap {
8181
class Map3[K <: AnyRef, +V >: Null <: AnyRef] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V) extends SimpleMap[K, V] {
8282
def size = 3
8383
def apply(k: K) =
84-
if (k == k1) v1
85-
else if (k == k2) v2
86-
else if (k == k3) v3
84+
if (k eq k1) v1
85+
else if (k eq k2) v2
86+
else if (k eq k3) v3
8787
else null
8888
def remove(k: K) =
89-
if (k == k1) new Map2(k2, v2, k3, v3)
90-
else if (k == k2) new Map2(k1, v1, k3, v3)
91-
else if (k == k3) new Map2(k1, v1, k2, v2)
89+
if (k eq k1) new Map2(k2, v2, k3, v3)
90+
else if (k eq k2) new Map2(k1, v1, k3, v3)
91+
else if (k eq k3) new Map2(k1, v1, k2, v2)
9292
else this
9393
def updated[V1 >: V <: AnyRef](k: K, v: V1) =
94-
if (k == k1) new Map3(k, v, k2, v2, k3, v3)
95-
else if (k == k2) new Map3(k1, v1, k, v, k3, v3)
96-
else if (k == k3) new Map3(k1, v1, k2, v2, k, v)
94+
if (k eq k1) new Map3(k, v, k2, v2, k3, v3)
95+
else if (k eq k2) new Map3(k1, v1, k, v, k3, v3)
96+
else if (k eq k3) new Map3(k1, v1, k2, v2, k, v)
9797
else new Map4(k1, v1, k2, v2, k3, v3, k, v)
9898
def mapValuesNow[V1 >: V <: AnyRef](f: (K, V1) => V1) = {
9999
val w1 = f(k1, v1); val w2 = f(k2, v2); val w3 = f(k3, v3)
@@ -106,22 +106,22 @@ object SimpleMap {
106106
class Map4[K <: AnyRef, +V >: Null <: AnyRef] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V) extends SimpleMap[K, V] {
107107
def size = 4
108108
def apply(k: K) =
109-
if (k == k1) v1
110-
else if (k == k2) v2
111-
else if (k == k3) v3
112-
else if (k == k4) v4
109+
if (k eq k1) v1
110+
else if (k eq k2) v2
111+
else if (k eq k3) v3
112+
else if (k eq k4) v4
113113
else null
114114
def remove(k: K) =
115-
if (k == k1) new Map3(k2, v2, k3, v3, k4, v4)
116-
else if (k == k2) new Map3(k1, v1, k3, v3, k4, v4)
117-
else if (k == k3) new Map3(k1, v1, k2, v2, k4, v4)
118-
else if (k == k4) new Map3(k1, v1, k2, v2, k3, v3)
115+
if (k eq k1) new Map3(k2, v2, k3, v3, k4, v4)
116+
else if (k eq k2) new Map3(k1, v1, k3, v3, k4, v4)
117+
else if (k eq k3) new Map3(k1, v1, k2, v2, k4, v4)
118+
else if (k eq k4) new Map3(k1, v1, k2, v2, k3, v3)
119119
else this
120120
def updated[V1 >: V <: AnyRef](k: K, v: V1) =
121-
if (k == k1) new Map4(k, v, k2, v2, k3, v3, k4, v4)
122-
else if (k == k2) new Map4(k1, v1, k, v, k3, v3, k4, v4)
123-
else if (k == k3) new Map4(k1, v1, k2, v2, k, v, k4, v4)
124-
else if (k == k4) new Map4(k1, v1, k2, v2, k3, v3, k, v)
121+
if (k eq k1) new Map4(k, v, k2, v2, k3, v3, k4, v4)
122+
else if (k eq k2) new Map4(k1, v1, k, v, k3, v3, k4, v4)
123+
else if (k eq k3) new Map4(k1, v1, k2, v2, k, v, k4, v4)
124+
else if (k eq k4) new Map4(k1, v1, k2, v2, k3, v3, k, v)
125125
else new MapMore(Array[AnyRef](k1, v1, k2, v2, k3, v3, k4, v4, k, v))
126126
def mapValuesNow[V1 >: V <: AnyRef](f: (K, V1) => V1) = {
127127
val w1 = f(k1, v1); val w2 = f(k2, v2); val w3 = f(k3, v3); val w4 = f(k4, v4)

0 commit comments

Comments
 (0)