diff options
author | Martin Odersky <odersky@gmail.com> | 2003-10-30 14:59:42 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-10-30 14:59:42 +0000 |
commit | d23d0a9c737c6350b3f00a555a3ec61fff8d92dc (patch) | |
tree | 7c6a3649edf42fceb39087c97eeae9f760a8503f /sources/scalac/symtab/classfile/UnPickle.java | |
parent | 4764fc555502237fc7f423af4200520a975a69fd (diff) | |
download | scala-d23d0a9c737c6350b3f00a555a3ec61fff8d92dc.tar.gz scala-d23d0a9c737c6350b3f00a555a3ec61fff8d92dc.tar.bz2 scala-d23d0a9c737c6350b3f00a555a3ec61fff8d92dc.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab/classfile/UnPickle.java')
-rw-r--r-- | sources/scalac/symtab/classfile/UnPickle.java | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java index 482287fbb7..68c2a99177 100644 --- a/sources/scalac/symtab/classfile/UnPickle.java +++ b/sources/scalac/symtab/classfile/UnPickle.java @@ -17,7 +17,7 @@ import scalac.symtab.*; import Symbol.*; import Type.*; -public class UnPickle implements Kinds, Modifiers, EntryTags { +public class UnPickle implements Kinds, Modifiers, EntryTags, TypeTags { /*************************************************** * Symbol table attribute format: see EntryTags.java @@ -91,6 +91,15 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { return x; } + long readLong(int n) { + long x = 0; + for (int i = 0; i < n; i++) { + x = (x << 8) + (readByte() & 0xff); + } + int leading = 64 - (n * 8); + return x << leading >> leading; + } + boolean isTypeEntry(int i) { int tag = bytes[index[i]]; return (firstTypeTag <= tag && tag <= lastTypeTag); @@ -328,6 +337,11 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { case SINGLEtpe: tpe = Type.singleType(readTypeRef(), readSymbolRef()); break; + case CONSTANTtpe: + Type base = readTypeRef(); + Object value = readValueRef(base); + tpe = new Type.ConstantType(base, value); + break; case TYPEREFtpe: tpe = Type.TypeRef( readTypeRef(), readSymbolRef(), readTypeRefs(end)); @@ -436,6 +450,44 @@ public class UnPickle implements Kinds, Modifiers, EntryTags { return flags; } + long getNumber(int n) { + int savedBp = bp; + bp = index[n]; + int tag = bytes[bp++]; + long x = readLong(readNat()); + bp = savedBp; + return x; + } + + long readNumberRef() { + return getNumber(readNat()); + } + + Object readValueRef(Type base) { + switch (base.unbox()) { + case UnboxedType(BYTE): + return new Byte((byte)readNumberRef()); + case UnboxedType(SHORT): + return new Short((short)readNumberRef()); + case UnboxedType(INT): + return new Integer((int)readNumberRef()); + case UnboxedType(CHAR): + return new Character((char)readNumberRef()); + case UnboxedType(LONG): + return new Long(readNumberRef()); + case UnboxedType(FLOAT): + return new Float(Float.intBitsToFloat((int)readNumberRef())); + case UnboxedType(DOUBLE): + return new Float(Double.longBitsToDouble(readNumberRef())); + case UnboxedType(BOOLEAN): + return new Boolean(readNumberRef() == 0 ? false : true); + case UnboxedType(STRING): + return readNameRef().toString(); + default: + return new ApplicationError("bad constant base type: " + base); + } + } + public static class BadSignature extends java.lang.Error { public BadSignature(UnPickle outer, String msg) { super("symbol data " + outer.sourceName + |