summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-02-26 09:50:05 +0000
committerMartin Odersky <odersky@gmail.com>2008-02-26 09:50:05 +0000
commite869cd34104701f8c55e19c542775679a1802edd (patch)
tree80f752abc7cd116a489fdc4a9b707fa7352761da /src/compiler
parentbcbeab74566f835219dabf0bbb172fd028a8a032 (diff)
downloadscala-e869cd34104701f8c55e19c542775679a1802edd.tar.gz
scala-e869cd34104701f8c55e19c542775679a1802edd.tar.bz2
scala-e869cd34104701f8c55e19c542775679a1802edd.zip
fixed #520, #489
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala23
2 files changed, 18 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 991808bad0..b510b41c4b 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -521,9 +521,8 @@ abstract class ClassfileParser {
while (sig(index) == '.') {
accept('.')
val name = subName(c => c == ';' || c == '.').toTypeName
- val clazz = tpe.typeSymbol.info.member(name)
- assert(clazz.isClass,
- tpe.typeSymbol.linkedModuleOfClass.moduleClass.info+" "+tpe+" . "+name+"/"+tpe.typeSymbol.info.decls)
+ val clazz = tpe.member(name)
+ assert(clazz.isAliasType, tpe)
tpe = processClassType(clazz.tpe)
}
accept(';')
@@ -747,7 +746,6 @@ abstract class ClassfileParser {
val nameIndex = in.nextChar
val jflags = in.nextChar
if (innerIndex != 0 && outerIndex != 0 && nameIndex != 0 &&
- (jflags & (JAVA_ACC_PUBLIC | JAVA_ACC_PROTECTED)) != 0 &&
pool.getClassSymbol(outerIndex) == sym) {
makeInnerAlias(
getOwner(jflags),
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
index 6bb7ec7369..20299dfc2a 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
@@ -43,7 +43,7 @@ abstract class Pickler extends SubComponent {
stats foreach pickle
case ClassDef(_, _, _, _) | ModuleDef(_, _, _) =>
val sym = tree.symbol
- val pickle = new Pickle(sym.name.toTermName, sym.owner)
+ val pickle = new Pickle(sym, sym.name.toTermName, sym.owner)
add(sym, pickle)
add(sym.linkedSym, pickle)
pickle.finish
@@ -62,23 +62,32 @@ abstract class Pickler extends SubComponent {
}
}
- private class Pickle(rootName: Name, rootOwner: Symbol)
+ private class Pickle(root: Symbol, rootName: Name, rootOwner: Symbol)
extends PickleBuffer(new Array[Byte](4096), -1, 0) {
import scala.collection.jcl.LinkedHashMap
private var entries = new Array[AnyRef](256)
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) =
+ false && sym.isAbstractType && sym.hasFlag(EXISTENTIAL) && sym.owner.isPackageClass
+
+ private def normalizedOwner(sym: Symbol) =
+ if (isUnrootedExistential(sym)) root else sym.owner
+
/** Is root in symbol.owner*?
*
* @param sym ...
* @return ...
*/
- private def isLocal(sym: Symbol): Boolean = (
+ private def isLocal(sym: Symbol): Boolean =
sym.isRefinementClass ||
sym.name.toTermName == rootName && sym.owner == rootOwner ||
- sym != NoSymbol && isLocal(sym.owner)
- )
+ sym != NoSymbol && isLocal(sym.owner) ||
+ isUnrootedExistential(sym)
// Phase 1 methods: Populate entries/index ------------------------------------
@@ -455,7 +464,7 @@ abstract class Pickler extends SubComponent {
private def writeSymInfo(sym: Symbol): Int = {
var posOffset = 0
writeRef(sym.name)
- writeRef(sym.owner)
+ writeRef(normalizedOwner(sym))
writeNat((sym.flags & PickledFlags).asInstanceOf[Int])
if (sym.privateWithin != NoSymbol) writeRef(sym.privateWithin)
writeRef(sym.info)
@@ -483,7 +492,7 @@ abstract class Pickler extends SubComponent {
} else {
writeRef(sym.name); EXTref
}
- if (!sym.owner.isRoot) writeRef(sym.owner);
+ if (!sym.owner.isRoot) writeRef(sym.owner)
tag
case sym: ClassSymbol =>
val posOffset = writeSymInfo(sym)