diff options
author | Martin Odersky <odersky@gmail.com> | 2006-01-24 17:49:28 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-01-24 17:49:28 +0000 |
commit | 73892507bc3a3b321a78e0501864b5080ddac130 (patch) | |
tree | 875e8b2cacba3a3f9cb796d98027c4918fa8a718 | |
parent | fa129e84e8390d7aadcae2f5214d57e85f8195e1 (diff) | |
download | scala-73892507bc3a3b321a78e0501864b5080ddac130.tar.gz scala-73892507bc3a3b321a78e0501864b5080ddac130.tar.bz2 scala-73892507bc3a3b321a78e0501864b5080ddac130.zip |
3 files changed, 37 insertions, 41 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/PickleFormat.scala b/src/compiler/scala/tools/nsc/symtab/classfile/PickleFormat.scala index 9769492be2..f5d776041e 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/PickleFormat.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/PickleFormat.scala @@ -45,7 +45,11 @@ object PickleFormat { * | 34 LITERALnull len_Nat * | 35 LITERALzero len_Nat * | 36 ATTRIBUTE sym_Ref type_Ref {constant_Ref} <not yet> - * | 37 POS len_Nat sym_Ref value_Long + * | 72 PosTYPEsym len_Nat pos_Nat SymbolInfo + * | 73 PosALIASsym len_Nat pos_Nat SymbolInfo + * | 74 PosCLASSsym len_Nat pos_Nat SymbolInfo [thistype_Ref] + * | 75 PosMODULEsym len_Nat pos_Nat SymbolInfo + * | 76 PosVALsym len_Nat pos_Nat SymbolInfo [alias_Ref] * SymbolInfo = name_Ref owner_Ref flags_Nat [privateWithin_Ref] info_Ref * NameInfo = <character sequence of length len_Nat in Utf8 format> * NumInfo = <len_Nat-byte signed number in big endian format> @@ -53,7 +57,7 @@ object PickleFormat { * * len is remaining length after `len'. */ - val MajorVersion = 3; + val MajorVersion = 4; val MinorVersion = 0; final val TERMname = 1; @@ -91,7 +95,6 @@ object PickleFormat { final val LITERALstring = 33; final val LITERALnull = 34; final val LITERALzero = 35; - final val POS = 37; final val ATTRIBUTE = 40; final val firstSymTag = NONEsym; @@ -99,4 +102,5 @@ object PickleFormat { final val lastExtSymTag = EXTMODCLASSref; final val firstTypeTag = NOtpe; final val lastTypeTag = POLYtpe; + final val PosOffset = 64; } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala index 4bb09c2271..0119f2b491 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala @@ -80,14 +80,11 @@ abstract class Pickler extends SubComponent { ep = ep + 1; true } - case class PositionSymbol(val sym : Symbol, val pos : Int); /** Store symbol in index. If symbol is local, also store everything it refers to. */ def putSymbol(sym: Symbol): unit = if (putEntry(sym)) { if (isLocal(sym)) { putEntry(sym.name); - if (sym.pos != Position.NOPOS) putEntry(new PositionSymbol(sym, sym.pos)); - putSymbol(sym.owner); putSymbol(sym.privateWithin); putType(sym.info); @@ -150,12 +147,18 @@ abstract class Pickler extends SubComponent { private def writeRefs(refs: List[AnyRef]): unit = refs foreach writeRef; /** Write name, owner, flags, and info of a symbol */ - private def writeSymInfo(sym: Symbol): unit = { + private def writeSymInfo(sym: Symbol): int = { + var posOffset = 0; + if (sym.pos != Position.NOPOS && sym.owner.isClass) { + writeNat(sym.pos); + posOffset = PosOffset + } writeRef(sym.name); writeRef(sym.owner); writeNat((sym.flags & PickledFlags).asInstanceOf[int]); if (sym.privateWithin != NoSymbol) writeRef(sym.privateWithin); - writeRef(sym.info) + writeRef(sym.info); + posOffset } /** Write a name in Utf8 format. */ @@ -182,16 +185,16 @@ abstract class Pickler extends SubComponent { if (!sym.owner.isRoot) writeRef(sym.owner); tag case sym: ClassSymbol => - writeSymInfo(sym); + val posOffset = writeSymInfo(sym); if (sym.thisSym != sym) writeRef(sym.typeOfThis); - CLASSsym + CLASSsym + posOffset; case sym: TypeSymbol => - writeSymInfo(sym); - if (sym.isAbstractType) TYPEsym else ALIASsym + val posOffset = writeSymInfo(sym); + (if (sym.isAbstractType) TYPEsym else ALIASsym) + posOffset case sym: TermSymbol => - writeSymInfo(sym); + val posOffset = writeSymInfo(sym); if (sym.alias != NoSymbol) writeRef(sym.alias); - if (sym.isModule) MODULEsym else VALsym + (if (sym.isModule) MODULEsym else VALsym) + posOffset case NoType => NOtpe case NoPrefix => @@ -230,7 +233,6 @@ abstract class Pickler extends SubComponent { for (val c <- cs) writeRef(cs); ATTRIBUTE */ - case PositionSymbol(sym, pos) => writeRef(sym); writeLong(pos); POS; case _ => throw new FatalError("bad entry: " + entry + " " + entry.getClass());//debug } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala index 5f268b9281..6746e165ec 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala @@ -35,7 +35,6 @@ abstract class UnPickler { for (val i <- Iterator.range(0, index.length)) { if (isSymbolEntry(i)) { at(i, readSymbol); () } - else if (isPosition(i)) { at(i, readPosition); () } } if (settings.debug.value) global.log("unpickled " + classRoot + ":" + classRoot.rawInfo + ", " + moduleRoot + ":" + moduleRoot.rawInfo);//debug @@ -58,16 +57,14 @@ abstract class UnPickler { /** Does entry represent an (internal) symbol */ private def isSymbolEntry(i: int): boolean = { - val tag = bytes(index(i)); + val tag = bytes(index(i)) % PosOffset; (firstSymTag <= tag && tag <= lastSymTag && (tag != CLASSsym || !isRefinementSymbolEntry(i))) } - private def isPosition(i: int): boolean = bytes(index(i)) == POS; - /** Does entry represent an (internal or external) symbol */ private def isSymbolRef(i: int): boolean = { - val tag = bytes(index(i)); + val tag = bytes(index(i)) % PosOffset; (firstSymTag <= tag && tag <= lastExtSymTag) } /** Does entry represent a refinement symbol? @@ -76,8 +73,10 @@ abstract class UnPickler { private def isRefinementSymbolEntry(i: int): boolean = { val savedIndex = readIndex; readIndex = index(i); - if (readByte() != CLASSsym) assert(false); - readNat(); + val tag = readByte(); + if (tag % PosOffset != CLASSsym) assert(false); + readNat(); // read length + if (tag > PosOffset) readNat(); // read position val result = readNameRef() == nme.REFINE_CLASS_NAME.toTypeName; readIndex = savedIndex; result @@ -109,16 +108,6 @@ abstract class UnPickler { } } - private def readPosition(): Integer = { - val tag = readByte(); - val len = readNat(); - val start = readIndex; - val sym = readSymbolRef(); - val pos = readLong(len - (readIndex - start)).asInstanceOf[Int]; - assert(sym.pos == Position.NOPOS); - sym.setPos(pos); - new Integer(pos); - } /** Read a symbol */ private def readSymbol(): Symbol = { val tag = readByte(); @@ -138,6 +127,7 @@ abstract class UnPickler { case NONEsym => sym = NoSymbol case _ => + val pos = if (tag > PosOffset) readNat() else Position.NOPOS; val name = readNameRef(); val owner = readSymbolRef(); val flags = readNat(); @@ -147,19 +137,19 @@ abstract class UnPickler { privateWithin = at(inforef, readSymbol); inforef = readNat() } - tag match { + (tag % PosOffset) match { case TYPEsym => - sym = owner.newAbstractType(Position.NOPOS, name); + sym = owner.newAbstractType(pos, name); case ALIASsym => - sym = owner.newAliasType(Position.NOPOS, name); + sym = owner.newAliasType(pos, name); case CLASSsym => sym = if (name == classRoot.name && owner == classRoot.owner) - if ((flags & MODULE) != 0) moduleRoot.moduleClass - else classRoot + (if ((flags & MODULE) != 0) moduleRoot.moduleClass + else classRoot).setPos(pos) else - if ((flags & MODULE) != 0) owner.newModuleClass(Position.NOPOS, name) - else owner.newClass(Position.NOPOS, name); + if ((flags & MODULE) != 0) owner.newModuleClass(pos, name) + else owner.newClass(pos, name); if (readIndex != end) sym.typeOfThis = new LazyTypeRef(readNat()) case MODULEsym => val clazz = at(inforef, readType).symbol; @@ -168,13 +158,13 @@ abstract class UnPickler { else { assert(clazz.isInstanceOf[ModuleClassSymbol], clazz); val mclazz = clazz.asInstanceOf[ModuleClassSymbol]; - val m = owner.newModule(Position.NOPOS, name, mclazz); + val m = owner.newModule(pos, name, mclazz); mclazz.setSourceModule(m); m } case VALsym => sym = if (name == moduleRoot.name && owner == moduleRoot.owner) moduleRoot.resetFlag(MODULE) - else owner.newValue(Position.NOPOS, name) + else owner.newValue(pos, name) case _ => errorBadSignature("bad symbol tag: " + tag); } |