diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-11-24 12:35:14 -0800 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-11-24 12:35:14 -0800 |
commit | c78d77c2b4b1927ce23314210a82b12046b47b01 (patch) | |
tree | dfd9c008124b086c6ff938a8bccab712728ddf1b | |
parent | 5b498a2612f967c944fa1ed4f63a09d6acc41791 (diff) | |
parent | d0de367e72ba695777cfec31d796f5972ae18601 (diff) | |
download | scala-c78d77c2b4b1927ce23314210a82b12046b47b01.tar.gz scala-c78d77c2b4b1927ce23314210a82b12046b47b01.tar.bz2 scala-c78d77c2b4b1927ce23314210a82b12046b47b01.zip |
Merge pull request #1662 from paulp/issue/6706
Fix for SI-6706, Symbol breakage under GC.
-rw-r--r-- | src/library/scala/Symbol.scala | 5 | ||||
-rw-r--r-- | test/files/run/t6706.scala | 14 |
2 files changed, 19 insertions, 0 deletions
diff --git a/src/library/scala/Symbol.scala b/src/library/scala/Symbol.scala index 723c05a30c..4fead7a50c 100644 --- a/src/library/scala/Symbol.scala +++ b/src/library/scala/Symbol.scala @@ -69,6 +69,11 @@ private[scala] abstract class UniquenessCache[K, V >: Null] val res = cached() if (res != null) res else { + // If we don't remove the old String key from the map, we can + // wind up with one String as the key and a different String as + // as the name field in the Symbol, which can lead to surprising + // GC behavior and duplicate Symbols. See SI-6706. + map remove name val sym = valueFromKey(name) map.put(name, new WeakReference(sym)) sym diff --git a/test/files/run/t6706.scala b/test/files/run/t6706.scala new file mode 100644 index 0000000000..905494ca8d --- /dev/null +++ b/test/files/run/t6706.scala @@ -0,0 +1,14 @@ +object Test { + var name = "foo" + 1 + var s1 = Symbol(name) + s1 = null + System.gc + val s2 = Symbol("foo1") + name = null + System.gc + val s3 = Symbol("foo1") + + def main(args: Array[String]): Unit = { + assert(s2 eq s3, ((s2, System.identityHashCode(s2), s3, System.identityHashCode(s3)))) + } +} |