summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala22
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala9
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala10
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ICodeReader.scala12
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala10
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