Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dd5a50b

Browse files
committed
Prevent presentation compiler crash on base type cache invalidation
See bug description for details.
1 parent dd497fb commit dd5a50b

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/reflect/scala/reflect/internal/Types.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5291,6 +5291,12 @@ trait Types
52915291
} finally res = saved
52925292
}
52935293

5294+
private def needClearBaseTypeCache(ct: CompoundType) = {
5295+
// was `ct.baseClasses.exists(changedSymbols)`, but `baseClasses` may force types early (scala/bug#13112)
5296+
val cache = ct.baseTypeSeqCache
5297+
cache != null && changedSymbols.exists(cache.baseTypeIndex(_) >= 0)
5298+
}
5299+
52945300
def apply(tp: Type): Unit = tp match {
52955301
case _ if seen.containsKey(tp) =>
52965302

@@ -5304,7 +5310,7 @@ trait Types
53045310
}
53055311
seen.put(tp, res)
53065312

5307-
case ct: CompoundType if ct.baseClasses.exists(changedSymbols) =>
5313+
case ct: CompoundType if needClearBaseTypeCache(ct) =>
53085314
ct.invalidatedCompoundTypeCaches()
53095315
res = true
53105316
seen.put(tp, res)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package scala.tools.nsc.interactive
2+
3+
import org.junit.Test
4+
5+
import scala.reflect.internal.util.BatchSourceFile
6+
import scala.tools.nsc.interactive.tests.InteractiveTest
7+
8+
class PresentationCompilerTest {
9+
@Test def run13112(): Unit = {
10+
t13112.main(null)
11+
}
12+
}
13+
14+
object t13112 extends InteractiveTest {
15+
val code =
16+
"""case class Foo(name: String = "")
17+
|object Foo extends Foo("")
18+
|""".stripMargin
19+
20+
override def execute(): Unit = {
21+
val source = new BatchSourceFile("Foo.scala", code)
22+
23+
val res = new Response[Unit]
24+
compiler.askReload(List(source), res)
25+
res.get
26+
askLoadedTyped(source).get
27+
28+
// the second round was failing (see scala/bug#13112 for details)
29+
compiler.askReload(List(source), res)
30+
res.get
31+
val reloadRes = askLoadedTyped(source).get
32+
assert(reloadRes.isLeft)
33+
}
34+
}

0 commit comments

Comments
 (0)