summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/classfile/UnPickle.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-10-30 14:59:42 +0000
committerMartin Odersky <odersky@gmail.com>2003-10-30 14:59:42 +0000
commitd23d0a9c737c6350b3f00a555a3ec61fff8d92dc (patch)
tree7c6a3649edf42fceb39087c97eeae9f760a8503f /sources/scalac/symtab/classfile/UnPickle.java
parent4764fc555502237fc7f423af4200520a975a69fd (diff)
downloadscala-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.java54
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 +