summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-11-16 12:31:40 +0000
committerMartin Odersky <odersky@gmail.com>2009-11-16 12:31:40 +0000
commit6063bf3d78d8b760c9ef88bc21c91dce6ba1a27c (patch)
tree86a09026b0c303e9b19e402b4d9d147f47e5360d
parent17d6cc444570f877f723be3af331b3cfc08729bb (diff)
downloadscala-6063bf3d78d8b760c9ef88bc21c91dce6ba1a27c.tar.gz
scala-6063bf3d78d8b760c9ef88bc21c91dce6ba1a27c.tar.bz2
scala-6063bf3d78d8b760c9ef88bc21c91dce6ba1a27c.zip
Fixed #2323; made Pickler do the right thing.
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala13
2 files changed, 12 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 942890e2f1..5d2d85c83d 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -2339,8 +2339,10 @@ A type's typeSymbol should never be inspected directly.
if (parents.isEmpty) ObjectClass.tpe else parents.head
else {
// having $anonfun as owner causes the pickler to break upon unpickling; see ticket #2323
- val nonAnonOwner = (owner.ownerChain dropWhile (_.isAnonymousFunction)).headOption getOrElse NoSymbol
- val clazz = nonAnonOwner.newRefinementClass(NoPosition)
+ // martin: I disabled this patch, replacing it with a fix in Pickler.
+ //val nonAnonOwner = (owner.ownerChain dropWhile (_.isAnonymousFunction)).headOption getOrElse NoSymbol
+ //val clazz = nonAnonOwner.newRefinementClass(NoPosition)
+ val clazz = owner.newRefinementClass(NoPosition)
val result = refinementOfClass(clazz, parents, decls)
clazz.setInfo(result)
result
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
index 84b08f1258..d93dc343c8 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
@@ -72,12 +72,15 @@ abstract class Pickler extends SubComponent {
// private var boundSyms: List[Symbol] = Nil
+ private def isRootSym(sym: Symbol) =
+ sym.name.toTermName == rootName && sym.owner == rootOwner
+
/** 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
+ if (isLocal(sym) && !isRootSym(sym) && !isLocal(sym.owner)) root
else sym.owner
/** Is root in symbol.owner*, or should it be treated as a local symbol
@@ -85,12 +88,12 @@ abstract class Pickler extends SubComponent {
* an existentially bound variable, or a higher-order type parameter.
*/
private def isLocal(sym: Symbol): Boolean =
- !sym.isPackageClass &&
- (sym.name.toTermName == rootName && sym.owner == rootOwner ||
- sym != NoSymbol && isLocal(sym.owner) ||
+ !sym.isPackageClass && sym != NoSymbol &&
+ (isRootSym(sym) ||
sym.isRefinementClass ||
sym.isAbstractType && sym.hasFlag(EXISTENTIAL) || // existential param
- (locals contains sym)) // higher-order type param
+ (locals contains sym) || // higher-order type param
+ isLocal(sym.owner))
private def staticAnnotations(annots: List[AnnotationInfo]) =
annots filter(ann =>