summaryrefslogtreecommitdiff
path: root/test/files/run
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2013-01-15 00:28:38 -0800
committerPaul Phillips <paulp@improving.org>2013-01-24 17:13:17 -0800
commit0d01cc1c300b718afd1fe69d5030d36d8000e0cd (patch)
tree2cacdd3e70574a4721b6e98fd9540ad0b43b46e1 /test/files/run
parente7ecaa00bbd5387870d0c26df4d8fba128b59c9e (diff)
downloadscala-0d01cc1c300b718afd1fe69d5030d36d8000e0cd.tar.gz
scala-0d01cc1c300b718afd1fe69d5030d36d8000e0cd.tar.bz2
scala-0d01cc1c300b718afd1fe69d5030d36d8000e0cd.zip
SI-6969, mishandling of SoftReferences in method cache.
More interesting to test than it was to fix. The soft reference is now dereferenced once, the locally stored underlying value ascertained to be non-null, and the remainder of the references to the value use the local var. The enclosed test reliably NPEs without this patch.
Diffstat (limited to 'test/files/run')
-rw-r--r--test/files/run/t6969.check1
-rw-r--r--test/files/run/t6969.scala28
2 files changed, 29 insertions, 0 deletions
diff --git a/test/files/run/t6969.check b/test/files/run/t6969.check
new file mode 100644
index 0000000000..78297812c9
--- /dev/null
+++ b/test/files/run/t6969.check
@@ -0,0 +1 @@
+All threads completed.
diff --git a/test/files/run/t6969.scala b/test/files/run/t6969.scala
new file mode 100644
index 0000000000..8cfc28c1e5
--- /dev/null
+++ b/test/files/run/t6969.scala
@@ -0,0 +1,28 @@
+object Test {
+ private type Clearable = { def clear(): Unit }
+ private def choke() = {
+ try new Array[Object]((Runtime.getRuntime().maxMemory min Int.MaxValue).toInt)
+ catch {
+ case _: OutOfMemoryError => // what do you mean, out of memory?
+ case t: Throwable => println(t)
+ }
+ }
+ private def f(x: Clearable) = x.clear()
+ class Choker(id: Int) extends Thread {
+ private def g(iteration: Int) = {
+ val map = scala.collection.mutable.Map[Int, Int](1 -> 2)
+ try f(map) catch { case t: NullPointerException => println(s"Failed at $id/$iteration") ; throw t }
+ choke()
+ }
+ override def run() {
+ 1 to 50 foreach g
+ }
+ }
+
+ def main(args: Array[String]): Unit = {
+ val threads = 1 to 3 map (id => new Choker(id))
+ threads foreach (_.start())
+ threads foreach (_.join())
+ println("All threads completed.")
+ }
+}