summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala1
-rw-r--r--src/library/scala/Symbol.scala14
-rw-r--r--src/library/scala/collection/immutable/Set.scala3
-rwxr-xr-xsrc/library/scala/collection/mutable/FlatHashTable.scala8
-rwxr-xr-xtest/files/run/collections.scala2
5 files changed, 23 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index 9757d417ee..0659ad808d 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -266,6 +266,7 @@ trait StdNames requires SymbolTable {
val hasNext = newTermName("hasNext")
val head = newTermName("head")
val identity = newTermName("identity")
+ val intern = newTermName("intern")
val isInstanceOf_ = newTermName("isInstanceOf")
val isInstanceOfErased = newTermName("isInstanceOf$erased")
val isDefinedAt = newTermName("isDefinedAt")
diff --git a/src/library/scala/Symbol.scala b/src/library/scala/Symbol.scala
index 4eaabd71da..4d30ef0fd6 100644
--- a/src/library/scala/Symbol.scala
+++ b/src/library/scala/Symbol.scala
@@ -11,6 +11,9 @@
package scala;
+import collection.jcl.WeakHashMap
+
+private[scala] object internedSymbols extends WeakHashMap[String, Symbol]
/** Instances of <code>Symbol</code> can be created easily with
* Scala's built-in quote mechanism. For instance, the Scala term
@@ -29,4 +32,15 @@ final case class Symbol(name: String) {
"'" + name
}
+ /** Makes this symbol into a unique reference.
+ * If two interened symbols are equal (i.e. they have the same name)
+ * then they must be identical (wrt reference equality)
+ */
+ def intern: Symbol = internedSymbols get name match {
+ case Some(sym) =>
+ sym
+ case None =>
+ internedSymbols(name) = this
+ this
+ }
}
diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala
index 3ecd3df5e2..1e80023199 100644
--- a/src/library/scala/collection/immutable/Set.scala
+++ b/src/library/scala/collection/immutable/Set.scala
@@ -22,6 +22,7 @@ package scala.collection.immutable
* <code>+</code> method for arbitrary types.
*
* @author Matthias Zenger
+ * @author Martin Odersky
* @version 1.1, 03/05/2004
*/
object Set {
@@ -31,7 +32,7 @@ object Set {
/** The canonical factory for this type
*/
- def apply[A <% Ordered[A]](elems: A*) = empty[A] ++ elems
+ def apply[A](elems: A*) = empty[A] ++ elems
}
trait Set[A] extends AnyRef with collection.Set[A] {
diff --git a/src/library/scala/collection/mutable/FlatHashTable.scala b/src/library/scala/collection/mutable/FlatHashTable.scala
index cd34cbc807..b6400f6b09 100755
--- a/src/library/scala/collection/mutable/FlatHashTable.scala
+++ b/src/library/scala/collection/mutable/FlatHashTable.scala
@@ -72,9 +72,11 @@ trait FlatHashTable[A] {
while (null != entry) {
if (entry == elem) {
var h1 = (h + 1) % table.length
- while (null != table(h1) && (index(elemHashCode(table(h1).asInstanceOf[A])) != h1)) {
- table(h) = table(h1)
- h = h1
+ while (null != table(h1)) {
+ if (index(elemHashCode(table(h1).asInstanceOf[A])) != h1) {
+ table(h) = table(h1)
+ h = h1
+ }
h1 = (h + 1) % table.length
}
table(h) = null
diff --git a/test/files/run/collections.scala b/test/files/run/collections.scala
index 430328a382..e1f769bf4c 100755
--- a/test/files/run/collections.scala
+++ b/test/files/run/collections.scala
@@ -105,7 +105,7 @@ object Test extends Application {
}
test("mutable.HashSet", new mutable.HashSet[int], 5000)
- test("immutable.Set", new immutable.HashSet[int], 5000)
+ test("immutable.Set", immutable.Set[int](), 5000)
test("immutable.ListSet", new immutable.ListSet[int], 5000)
test("immutable.TreeSet", new immutable.TreeSet[int], 5000)
test("mutable.HashMap", new mutable.HashMap[int, int], 5000)