diff options
author | Martin Odersky <odersky@gmail.com> | 2006-01-07 18:55:52 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-01-07 18:55:52 +0000 |
commit | 5d4d8b21cec21fe23490e66182a9b4890e15a9d1 (patch) | |
tree | 08ae4bea839be06376d87f559502fb7324096af2 /src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | |
parent | e30e2a33045b88afbaef190b94a692105d813aa0 (diff) | |
download | scala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.tar.gz scala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.tar.bz2 scala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.zip |
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index e5803d18e5..ffd5add6f0 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -65,7 +65,8 @@ abstract class ClassfileParser { parseClass() } catch { case e: RuntimeException => - if (settings.debug.value) e.printStackTrace(); + e.printStackTrace(); + if (settings.debug.value) throw new IOException("class file '" + in.file + "' is broken") } busy = false @@ -249,6 +250,7 @@ abstract class ClassfileParser { parseAttributes(clazz, classInfo); if (!isScala) { clazz.setFlag(sflags); + setPrivateWithin(clazz, jflags); if (!hasMeta) { clazz.setInfo(classInfo); } @@ -281,6 +283,7 @@ abstract class ClassfileParser { val info = pool.getType(in.nextChar()); val sym = getOwner(jflags) .newValue(Position.NOPOS, name).setFlag(sflags).setInfo(info); + setPrivateWithin(sym, jflags); parseAttributes(sym, info); getScope(jflags).enter(sym); } @@ -303,12 +306,19 @@ abstract class ClassfileParser { } val sym = getOwner(jflags) .newMethod(Position.NOPOS, name).setFlag(sflags).setInfo(info); + setPrivateWithin(sym, jflags); parseAttributes(sym, info); getScope(jflags).enter(sym); } } def parseAttributes(sym: Symbol, symtype: Type): unit = { + def convertTo(c: Constant, pt: Type): Constant = { + if (pt.symbol == definitions.BooleanClass && c.tag == IntTag) + Constant(if (c.value == 0) false else true) + else + c convertTo pt + } def parseAttribute(): unit = { val attrName = pool.getName(in.nextChar()); val attrLen = in.nextInt(); @@ -324,8 +334,9 @@ abstract class ClassfileParser { in.skip(attrLen) case nme.ConstantValueATTR => val c = pool.getConstant(in.nextChar()); - val c1 = c convertTo symtype; - sym.setInfo(ConstantType(c1)); + val c1 = convertTo(c, symtype); + if (c1 != null) sym.setInfo(ConstantType(c1)); + else System.out.println("failure to convert "+c+" to "+symtype);//debug case nme.InnerClassesATTR => parseInnerClasses() case nme.ScalaSignatureATTR => @@ -385,8 +396,6 @@ abstract class ClassfileParser { res = res | PRIVATE else if ((flags & JAVA_ACC_PROTECTED) != 0) res = res | PROTECTED - else if ((flags & JAVA_ACC_PUBLIC) == 0) - res = res | PRIVATE; if ((flags & JAVA_ACC_ABSTRACT) != 0) res = res | DEFERRED; if ((flags & JAVA_ACC_FINAL) != 0) @@ -399,4 +408,8 @@ abstract class ClassfileParser { res = res | STATIC; res | JAVA; } + + private def setPrivateWithin(sym: Symbol, jflags: int): unit = + if ((jflags & (JAVA_ACC_PRIVATE | JAVA_ACC_PROTECTED | JAVA_ACC_PUBLIC)) == 0) + sym.privateWithin = sym.toplevelClass.owner } |