summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-01-24 17:49:28 +0000
committerMartin Odersky <odersky@gmail.com>2006-01-24 17:49:28 +0000
commit73892507bc3a3b321a78e0501864b5080ddac130 (patch)
tree875e8b2cacba3a3f9cb796d98027c4918fa8a718
parentfa129e84e8390d7aadcae2f5214d57e85f8195e1 (diff)
downloadscala-73892507bc3a3b321a78e0501864b5080ddac130.tar.gz
scala-73892507bc3a3b321a78e0501864b5080ddac130.tar.bz2
scala-73892507bc3a3b321a78e0501864b5080ddac130.zip
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/PickleFormat.scala10
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala26
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala42
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);
}