diff options
5 files changed, 41 insertions, 22 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 5b02c6b46e..5d6351d24b 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -133,7 +133,7 @@ abstract class GenJVM extends SubComponent { } if (!(jclass.getName().endsWith("$") && sym.isModuleClass)) addScalaAttr(if (isTopLevelModule(sym)) sym.sourceModule else sym); - addInnerClasses + addInnerClasses(jclass) val outfile = getFile(jclass, ".class") val outstream = new DataOutputStream(outfile.output) @@ -406,7 +406,7 @@ abstract class GenJVM extends SubComponent { } def addGenericSignature(jmember: JMember, sym: Symbol) { - if (!sym.hasFlag(Flags.PRIVATE | Flags.EXPANDEDNAME | Flags.SYNTHETIC) && settings.target.value == "jvm-1.5") { + if (settings.target.value == "jvm-1.5") { erasure.javaSig(sym) match { case Some(sig) => val index = jmember.getConstantPool().addUtf8(sig).toShort @@ -466,11 +466,14 @@ abstract class GenJVM extends SubComponent { jmember.addAttribute(attr) } - def addInnerClasses { + def addInnerClasses(jclass: JClass) { + def addOwnInnerClasses(cls: Symbol) { + for (sym <- cls.info.decls.elements if sym.isClass) + innerClasses = innerClasses + sym; + } // add inner classes which might not have been referenced yet atPhase(currentRun.erasurePhase) { - for (sym <- clasz.symbol.info.decls.elements if sym.isClass) - innerClasses = innerClasses + sym; + addOwnInnerClasses(clasz.symbol) } if (!innerClasses.isEmpty) { @@ -480,13 +483,16 @@ abstract class GenJVM extends SubComponent { for (innerSym <- innerClasses.toList.sort(_.name.length < _.name.length)) { var outerName = javaName(innerSym.rawowner) // remove the trailing '$' - //if (outerName.endsWith("$")) - //outerName = outerName.substring(0, outerName.length - 1) + if (outerName.endsWith("$")) + outerName = outerName.substring(0, outerName.length - 1) + var flags = javaFlags(innerSym) + if (innerSym.rawowner.hasFlag(Flags.MODULE)) + flags |= JAccessFlags.ACC_STATIC innerClassesAttr.addEntry(javaName(innerSym), outerName, innerSym.rawname.toString, - javaFlags(innerSym)); + flags); } } } diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 3e9230ca68..763c23e953 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -366,10 +366,17 @@ trait Definitions { private def newCovariantPolyClass(owner: Symbol, name: Name, parent: Symbol => Type): Symbol = { val clazz = newClass(owner, name, List()) val tparam = newTypeParam(clazz, 0) setFlag COVARIANT + val p = parent(tparam) +/* p.typeSymbol.initialize + println(p.typeSymbol + " flags: " + Flags.flagsToString(p.typeSymbol.flags)) + val parents = /*if (p.typeSymbol.isTrait) + List(definitions.AnyRefClass.tpe, p) + else*/ List(p) + println("creating " + name + " with parents " + parents) */ clazz.setInfo( PolyType( List(tparam), - ClassInfoType(List(parent(tparam)), newClassScope(clazz), clazz))) + ClassInfoType(List(p), newClassScope(clazz), clazz))) } private def newAlias(owner: Symbol, name: Name, alias: Type): Symbol = { diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 5a74c9087c..e6422c5b99 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -204,7 +204,11 @@ abstract class ClassfileParser { in.buf(start) != CONSTANT_METHODREF && in.buf(start) != CONSTANT_INTFMETHODREF) errorBadTag(start) val ownerTpe = getClassOrArrayType(in.getChar(start + 1)) + if (settings.debug.value) + log("getMemberSymbol(static: " + static + "): owner type: " + ownerTpe + " " + ownerTpe.typeSymbol.originalName) val (name, tpe) = getNameAndType(in.getChar(start + 3), ownerTpe) + if (settings.debug.value) + log("getMemberSymbol: name and tpe: " + name + ": " + tpe) if (name == nme.MODULE_INSTANCE_FIELD) { val index = in.getChar(start + 1) val name = getExternalName(in.getChar(starts(index) + 1)) @@ -377,8 +381,10 @@ abstract class ClassfileParser { val classInfo = ClassInfoType(parents, instanceDefs, clazz) val staticInfo = ClassInfoType(List(), staticDefs, statics) - if (!isScala && !isScalaRaw) + if (!isScala && !isScalaRaw) { + //println("Entering inner classes for " + clazz) enterOwnInnerClasses + } val curbp = in.bp skipMembers() // fields skipMembers() // methods @@ -386,7 +392,7 @@ abstract class ClassfileParser { clazz.setFlag(sflags) setPrivateWithin(clazz, jflags) setPrivateWithin(staticModule, jflags) - if (!hasMeta) { + if (!hasMeta || isScalaRaw) { clazz.setInfo(classInfo) } statics.setInfo(staticInfo) diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala index 67cb5e42e4..5d185e49b0 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala @@ -51,13 +51,11 @@ abstract class ICodeReader extends ClassfileParser { if (entry ne null) { classFile = entry.classFile // if (isScalaModule) - //sym = cls.linkedClassOfModule +// sym = cls.linkedClassOfModule assert(classFile ne null, "No classfile for " + cls) // for (s <- cls.info.members) // Console.println("" + s + ": " + s.tpe) - this.instanceCode = new IClass(sym) - this.staticCode = new IClass(sym.linkedClassOfClass) parse(classFile, sym) } else log("Could not find: " + cls) @@ -75,13 +73,14 @@ abstract class ICodeReader extends ClassfileParser { } override def parseClass() { + this.instanceCode = new IClass(clazz) + this.staticCode = new IClass(staticModule) val jflags = in.nextChar val isAttribute = (jflags & JAVA_ACC_ANNOTATION) != 0 var sflags = transFlags(jflags, true) if ((sflags & DEFERRED) != 0) sflags = sflags & ~DEFERRED | ABSTRACT val c = pool.getClassSymbol(in.nextChar) -// if (c != clazz) -// throw new IOException("class file '" + in.file + "' contains " + c + "instead of " + clazz) + parseInnerClasses() in.skip(2) // super class @@ -643,7 +642,8 @@ abstract class ICodeReader extends ClassfileParser { * There are two possible classes, the static part and the instance part. */ def getCode(flags: Int): IClass = - if ((flags & JAVA_ACC_STATIC) != 0) staticCode else instanceCode + if (isScalaModule) staticCode + else if ((flags & JAVA_ACC_STATIC) != 0) staticCode else instanceCode class LinearCode { var instrs: ListBuffer[(Int, Instruction)] = new ListBuffer diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala index 79c1c490a7..b8ba347b8f 100644 --- a/src/compiler/scala/tools/nsc/transform/Mixin.scala +++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala @@ -677,12 +677,12 @@ abstract class Mixin extends InfoTransform { && !sym.isOuterAccessor) if (settings.debug.value) { - println("needsInitFlag(" + sym.fullNameString + "): " + res) - println("\tsym.isGetter: " + sym.isGetter) - println("\t!isInitializedToDefault: " + !sym.isInitializedToDefault + sym.hasFlag(DEFAULTINIT) + sym.hasFlag(ACCESSOR) + sym.isTerm) - println("\t!sym.hasFlag(PARAMACCESSOR): " + !sym.hasFlag(PARAMACCESSOR)) + log("needsInitFlag(" + sym.fullNameString + "): " + res) + log("\tsym.isGetter: " + sym.isGetter) + log("\t!isInitializedToDefault: " + !sym.isInitializedToDefault + sym.hasFlag(DEFAULTINIT) + sym.hasFlag(ACCESSOR) + sym.isTerm) + log("\t!sym.hasFlag(PARAMACCESSOR): " + !sym.hasFlag(PARAMACCESSOR)) //println("\t!sym.accessed.hasFlag(PRESUPER): " + !sym.accessed.hasFlag(PRESUPER)) - println("\t!sym.isOuterAccessor: " + !sym.isOuterAccessor) + log("\t!sym.isOuterAccessor: " + !sym.isOuterAccessor) } res |