From bc3e3c54fba45125f3ab2e27a6add43ceaa8f49e Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 18 Sep 2010 17:04:32 +0000 Subject: Better unlocking behavior when exceptions are r... Better unlocking behavior when exceptions are raised. Review by moors. --- src/compiler/scala/tools/nsc/symtab/Symbols.scala | 7 +++++-- src/compiler/scala/tools/nsc/typechecker/Typers.scala | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 8d02a120d3..ab79f735b4 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -27,6 +27,9 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => /** Used for deciding in the IDE whether we can interrupt the compiler */ protected var activeLocks = 0 + /** Used for debugging only */ + protected var lockedSyms = collection.immutable.Set[Symbol]() + /** Used to keep track of the recursion depth on locked symbols */ private var recursionTable = Map.empty[Symbol, Int] @@ -718,6 +721,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => assert(infos.prev eq null, this.name) val tp = infos.info //if (settings.debug.value) System.out.println("completing " + this.rawname + tp.getClass());//debug + if ((rawflags & LOCKED) != 0L) { // rolled out once for performance lock { setInfo(ErrorType) @@ -731,9 +735,8 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => try { phase = phaseOf(infos.validFrom) tp.complete(this) - // if (settings.debug.value && runId(validTo) == currentRunId) System.out.println("completed " + this/* + ":" + info*/);//DEBUG - unlock() } finally { + unlock() phase = current } cnt += 1 diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index f793da0c54..52ea62e656 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -358,13 +358,13 @@ trait Typers { self: Analyzer => } } - def checkNonCyclic(pos: Position, tp: Type, lockedSym: Symbol): Boolean = { + def checkNonCyclic(pos: Position, tp: Type, lockedSym: Symbol): Boolean = try { lockedSym.lock { throw new TypeError("illegal cyclic reference involving " + lockedSym) } - val result = checkNonCyclic(pos, tp) + checkNonCyclic(pos, tp) + } finally { lockedSym.unlock() - result } def checkNonCyclic(sym: Symbol) { @@ -697,6 +697,7 @@ trait Typers { self: Analyzer => /** The member with given name of given qualifier tree */ def member(qual: Tree, name: Name) = qual.tpe match { case ThisType(clazz) if (context.enclClass.owner.hasTransOwner(clazz)) => + // println("member") qual.tpe.member(name) case _ => if (phase.next.erasedTypes) qual.tpe.member(name) -- cgit v1.2.3