summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2013-09-12 10:18:38 -0700
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2013-09-12 10:18:38 -0700
commit5f7d7259452662937740147162e9c3c4e9a53e5d (patch)
tree34b0b7cf0aeafb450521daaede5922a4855dc951
parent289fbcb15f2bbab3db1a5ef7df340c7e48d8ab2d (diff)
parentfdd860df184f4c8bc6997ce2c1045b23c9fb61aa (diff)
downloadscala-5f7d7259452662937740147162e9c3c4e9a53e5d.tar.gz
scala-5f7d7259452662937740147162e9c3c4e9a53e5d.tar.bz2
scala-5f7d7259452662937740147162e9c3c4e9a53e5d.zip
Merge pull request #2905 from retronym/ticket/7801
SI-7801 Fix a nightmarish bug in Symbols#adaptInfos
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala14
-rw-r--r--test/files/run/t7801.check11
-rw-r--r--test/files/run/t7801.scala12
3 files changed, 33 insertions, 4 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index d3a0ffb744..d58ea09386 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -1435,6 +1435,13 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
assert(isCompilerUniverse)
if (infos == null || runId(infos.validFrom) == currentRunId) {
infos
+ } else if (isPackageClass) {
+ // SI-7801 early phase package scopes are mutated in new runs (Namers#enterPackage), so we have to
+ // discard transformed infos, rather than just marking them as from this run.
+ val oldest = infos.oldest
+ oldest.validFrom = validTo
+ this.infos = oldest
+ oldest
} else {
val prev1 = adaptInfos(infos.prev)
if (prev1 ne infos.prev) prev1
@@ -1444,10 +1451,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
_validTo = period(currentRunId, pid)
phase = phaseWithId(pid)
- val info1 = (
- if (isPackageClass) infos.info
- else adaptToNewRunMap(infos.info)
- )
+ val info1 = adaptToNewRunMap(infos.info)
if (info1 eq infos.info) {
infos.validFrom = validTo
infos
@@ -3473,6 +3477,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
"TypeHistory(" + phaseOf(validFrom)+":"+runId(validFrom) + "," + info + "," + prev + ")"
def toList: List[TypeHistory] = this :: ( if (prev eq null) Nil else prev.toList )
+
+ def oldest: TypeHistory = if (prev == null) this else prev.oldest
}
// ----- Hoisted closures and convenience methods, for compile time reductions -------
diff --git a/test/files/run/t7801.check b/test/files/run/t7801.check
new file mode 100644
index 0000000000..d72060c684
--- /dev/null
+++ b/test/files/run/t7801.check
@@ -0,0 +1,11 @@
+Type in expressions to have them evaluated.
+Type :help for more information.
+
+scala> val g: scala.reflect.internal.SymbolTable = null; import g.abort
+g: scala.reflect.internal.SymbolTable = null
+import g.abort
+
+scala> class C(val a: Any) extends AnyVal
+defined class C
+
+scala>
diff --git a/test/files/run/t7801.scala b/test/files/run/t7801.scala
new file mode 100644
index 0000000000..3a3cc97a51
--- /dev/null
+++ b/test/files/run/t7801.scala
@@ -0,0 +1,12 @@
+import scala.tools.partest.ReplTest
+
+// was crashing due to a subtle interaction of the Namer entering packages into
+// enclosing packages by mutating the scope in place without invalidating later
+// entries in the enclosing package class symbols type history.
+//
+// Sadly, I couldn't whittle the test case down further.
+object Test extends ReplTest {
+ override def code = """val g: scala.reflect.internal.SymbolTable = null; import g.abort
+ |class C(val a: Any) extends AnyVal""".stripMargin
+
+}