summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-09-22 11:50:31 +0000
committerMartin Odersky <odersky@gmail.com>2009-09-22 11:50:31 +0000
commit44e60b3ae61a4eccc1ee8ae4be2f8292c33a3d59 (patch)
tree1a9806fdf28ef0c4ed50123563d49ac7318e7c79
parent6f18d00708160c9363ed130ca96b4b2d18f7ac90 (diff)
downloadscala-44e60b3ae61a4eccc1ee8ae4be2f8292c33a3d59.tar.gz
scala-44e60b3ae61a4eccc1ee8ae4be2f8292c33a3d59.tar.bz2
scala-44e60b3ae61a4eccc1ee8ae4be2f8292c33a3d59.zip
Attempt at fix for lift crash on 2.7.6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala47
1 files changed, 29 insertions, 18 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
index 471754dc4a..d36ca29afa 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
@@ -74,25 +74,26 @@ abstract class Pickler extends SubComponent {
private var ep = 0
private val index = new LinkedHashMap[AnyRef, Int]
- /** Is symbol an existentially bound variable with a package as owner?
- * Such symbols should be treated as if they were local.
- */
- private def isUnrootedExistential(sym: Symbol) =
- sym.isAbstractType && sym.hasFlag(EXISTENTIAL)
+// private var boundSyms: List[Symbol] = Nil
- private def normalizedOwner(sym: Symbol) =
- if (isUnrootedExistential(sym)) root else sym.owner
+ /** Returns usually symbol's owner, but picks classfile root instead
+ * for existentially bound variables that have a non-local owner.
+ * Question: Should this be done for refinement class symbols as well?
+ */
+ private def localizedOwner(sym: Symbol) =
+ if (sym.isAbstractType && sym.hasFlag(EXISTENTIAL) && !isLocal(sym.owner)) root
+ else sym.owner
- /** Is root in symbol.owner*?
- *
- * @param sym ...
- * @return ...
+ /** Is root in symbol.owner*, or should it be treated as a local symbol
+ * anyway? This is the case if symbol is a refinement class or
+ * an existentially bound variable.
*/
private def isLocal(sym: Symbol): Boolean =
- sym.isRefinementClass ||
- sym.name.toTermName == rootName && sym.owner == rootOwner ||
- sym != NoSymbol && isLocal(sym.owner) ||
- isUnrootedExistential(sym)
+ !sym.isPackageClass &&
+ (sym.name.toTermName == rootName && sym.owner == rootOwner ||
+ sym != NoSymbol && isLocal(sym.owner) ||
+ sym.isRefinementClass ||
+ sym.isAbstractType && sym.hasFlag(EXISTENTIAL))
private def staticAnnotations(annots: List[AnnotationInfo]) =
annots filter(ann =>
@@ -177,6 +178,9 @@ abstract class Pickler extends SubComponent {
case ConstantType(value) =>
putConstant(value)
case TypeRef(pre, sym, args) =>
+// if (sym.isAbstractType && (sym hasFlag EXISTENTIAL))
+// if (!(boundSyms contains sym))
+// println("unbound existential: "+sym+sym.locationString)
putType(pre); putSymbol(sym); putTypes(args)
case TypeBounds(lo, hi) =>
putType(lo); putType(hi)
@@ -192,7 +196,14 @@ abstract class Pickler extends SubComponent {
case PolyType(tparams, restpe) =>
putType(restpe); putSymbols(tparams)
case ExistentialType(tparams, restpe) =>
- putType(restpe); putSymbols(tparams)
+// val savedBoundSyms = boundSyms
+// boundSyms = tparams ::: boundSyms
+// try {
+ putType(restpe);
+// } finally {
+// boundSyms = savedBoundSyms
+// }
+ putSymbols(tparams)
case AnnotatedType(annotations, underlying, selfsym) =>
putType(underlying)
if (settings.selfInAnnots.value) putSymbol(selfsym)
@@ -483,7 +494,7 @@ abstract class Pickler extends SubComponent {
*/
private def writeSymInfo(sym: Symbol) {
writeRef(sym.name)
- writeRef(normalizedOwner(sym))
+ writeRef(localizedOwner(sym))
writeLongNat((rawFlagsToPickled(sym.flags & PickledFlags)))
if (sym.privateWithin != NoSymbol) writeRef(sym.privateWithin)
writeRef(sym.info)
@@ -990,7 +1001,7 @@ abstract class Pickler extends SubComponent {
def printSymInfo(sym: Symbol) {
var posOffset = 0
printRef(sym.name)
- printRef(normalizedOwner(sym))
+ printRef(localizedOwner(sym))
print(flagsToString(sym.flags & PickledFlags)+" ")
if (sym.privateWithin != NoSymbol) printRef(sym.privateWithin)
printRef(sym.info)