summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/classfile/UnPickle.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-07-17 14:29:40 +0000
committerMartin Odersky <odersky@gmail.com>2003-07-17 14:29:40 +0000
commit086e26c6bb594514e533ae2f3410f7ccfa399b99 (patch)
tree1936db734d7753a3e64258e269762868ca447bcc /sources/scalac/symtab/classfile/UnPickle.java
parentd4945a881b5b25ededfc990ac9a50dc288690f49 (diff)
downloadscala-086e26c6bb594514e533ae2f3410f7ccfa399b99.tar.gz
scala-086e26c6bb594514e533ae2f3410f7ccfa399b99.tar.bz2
scala-086e26c6bb594514e533ae2f3410f7ccfa399b99.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab/classfile/UnPickle.java')
-rw-r--r--sources/scalac/symtab/classfile/UnPickle.java35
1 files changed, 34 insertions, 1 deletions
diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java
index eed1fdc00a..7c46a2d6e4 100644
--- a/sources/scalac/symtab/classfile/UnPickle.java
+++ b/sources/scalac/symtab/classfile/UnPickle.java
@@ -39,6 +39,7 @@ public class UnPickle implements Kinds, Modifiers, EntryTags {
* | METHODtpe len_Nat tpe_Ref {tpe_Ref}
* | POLYTtpe len_Nat tpe_Ref {sym_Ref}
* | OVERLOADEDtpe len_Nat {sym_Ref} {tpe_Ref}
+ * | FLAGGEDtype len_Nat flags_Nat tpe_Ref
* SymbolInfo = name_Ref owner_Ref flags_Nat info_Ref
* NameInfo = <character sequence of length len_Nat in Utf8 format>
* Ref = Nat
@@ -54,6 +55,7 @@ public class UnPickle implements Kinds, Modifiers, EntryTags {
Name sourceName;
int[] index;
Object[] entries;
+ int paramFlags;
UnPickle(Symbol root, byte[] data, Name sourceName) {
assert root.rawInfoAt(Symbol.FIRST_ID) instanceof LazyType;
@@ -318,12 +320,16 @@ public class UnPickle implements Kinds, Modifiers, EntryTags {
break;
case METHODtpe:
Type restype = readTypeRef();
+ int bp1 = bp;
Type[] argtypes = readTypeRefs(end);
+ int[] flags = new int[argtypes.length];
+ bp = bp1;
+ readFlags(flags);
Symbol[] params = new Symbol[argtypes.length];
for (int i = 0; i < argtypes.length; i++) {
params[i] = new TermSymbol(
Position.NOPOS, Name.fromString("$" + i),
- Symbol.NONE, PARAM);
+ Symbol.NONE, PARAM | flags[i]);
params[i].setInfo(argtypes[i]);
}
tpe = Type.MethodType(params, restype);
@@ -339,6 +345,9 @@ public class UnPickle implements Kinds, Modifiers, EntryTags {
alttypes[i] = setOwner(alttypes[i], alts[i]);
tpe = Type.OverloadedType(alts, alttypes);
break;
+ case FLAGGEDtpe:
+ paramFlags = getFlags(readNat());
+ return readTypeRef();
default:
throw new BadSignature(this);
}
@@ -373,6 +382,30 @@ public class UnPickle implements Kinds, Modifiers, EntryTags {
}
}
+ void readFlags(int[] flags) {
+ for (int i = 0; i < flags.length; i++)
+ flags[i] = getFlags(readNat());
+ }
+
+ int getFlags(int n) {
+ int savedBp = bp;
+ bp = index[n];
+ int tag = bytes[bp++];
+ int end = readNat() + bp;
+ int flags = (tag == FLAGGEDtpe) ? decodeFlags(readNat()) : 0;
+ bp = savedBp;
+ return flags;
+ }
+
+ private static int decodeFlags(int n) {
+ int flags = 0;
+ if ((n & COVARflag) != 0) flags |= COVARIANT;
+ if ((n & CONTRAVARflag) != 0) flags |= CONTRAVARIANT;
+ if ((n & REPEATEDflag) != 0) flags |= REPEATED;
+ if ((n & DEFflag) != 0) flags |= DEF;
+ return flags;
+ }
+
public static class BadSignature extends java.lang.Error {
public BadSignature(UnPickle outer, String msg) {
super("symbol data " + outer.sourceName +