summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/pickling
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-02-08 14:57:43 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-02-08 14:57:43 +0100
commit21a765feb0efeeecd671ede637a12f5088ac8257 (patch)
tree5e3bf3a75c0dc8a505ba7033470fe50ed2250039 /src/reflect/scala/reflect/internal/pickling
parent896e7cc42e703f735c8fefbb51c6e700a6651814 (diff)
parentdc3fccb59d9ac848550b3264608ce9b7bdbfe624 (diff)
downloadscala-21a765feb0efeeecd671ede637a12f5088ac8257.tar.gz
scala-21a765feb0efeeecd671ede637a12f5088ac8257.tar.bz2
scala-21a765feb0efeeecd671ede637a12f5088ac8257.zip
Merge pull request #3391 from xeno-by/ticket/8131
SI-8131 fixes residual race condition in runtime reflection
Diffstat (limited to 'src/reflect/scala/reflect/internal/pickling')
-rw-r--r--src/reflect/scala/reflect/internal/pickling/UnPickler.scala12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/reflect/scala/reflect/internal/pickling/UnPickler.scala b/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
index 2a19441476..42f794736a 100644
--- a/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
+++ b/src/reflect/scala/reflect/internal/pickling/UnPickler.scala
@@ -275,6 +275,7 @@ abstract class UnPickler {
def pflags = flags & PickledFlags
def finishSym(sym: Symbol): Symbol = {
+ markFlagsCompleted(sym)(mask = AllFlags)
sym.privateWithin = privateWithin
sym.info = (
if (atEnd) {
@@ -663,7 +664,7 @@ abstract class UnPickler {
private class LazyTypeRef(i: Int) extends LazyType with FlagAgnosticCompleter {
private val definedAtRunId = currentRunId
private val p = phase
- override def complete(sym: Symbol) : Unit = try {
+ protected def completeInternal(sym: Symbol) : Unit = try {
val tp = at(i, () => readType(sym.isTerm)) // after NMT_TRANSITION, revert `() => readType(sym.isTerm)` to `readType`
if (p ne null)
slowButSafeEnteringPhase(p) (sym setInfo tp)
@@ -673,6 +674,10 @@ abstract class UnPickler {
catch {
case e: MissingRequirementError => throw toTypeError(e)
}
+ override def complete(sym: Symbol) : Unit = {
+ completeInternal(sym)
+ if (!isCompilerUniverse) markAllCompleted(sym)
+ }
override def load(sym: Symbol) { complete(sym) }
}
@@ -680,8 +685,9 @@ abstract class UnPickler {
* of completed symbol to symbol at index `j`.
*/
private class LazyTypeRefAndAlias(i: Int, j: Int) extends LazyTypeRef(i) {
- override def complete(sym: Symbol) = try {
- super.complete(sym)
+ override def completeInternal(sym: Symbol) = try {
+ super.completeInternal(sym)
+
var alias = at(j, readSymbol)
if (alias.isOverloaded)
alias = slowButSafeEnteringPhase(picklerPhase)((alias suchThat (alt => sym.tpe =:= sym.owner.thisType.memberType(alt))))