diff options
Diffstat (limited to 'sources/scalac/symtab/classfile')
-rw-r--r-- | sources/scalac/symtab/classfile/CLRClassParser.java | 8 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassfileParser.java | 10 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/Pickle.java | 4 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/UnPickle.java | 12 |
4 files changed, 21 insertions, 13 deletions
diff --git a/sources/scalac/symtab/classfile/CLRClassParser.java b/sources/scalac/symtab/classfile/CLRClassParser.java index 51b156b461..cbcf042e46 100644 --- a/sources/scalac/symtab/classfile/CLRClassParser.java +++ b/sources/scalac/symtab/classfile/CLRClassParser.java @@ -199,9 +199,13 @@ public class CLRClassParser extends SymbolLoader { if (mtype == null) continue; Symbol constr = clazz.primaryConstructor(); - if (constr.isInitialized()) constr = clazz.addConstructor(); int mods = translateAttributes(constrs[i]); - TermSymbol.newConstructor(clazz, mods).copyTo(constr); + if (constr.isInitialized()) { + clazz.addConstructor( + constr = clazz.newConstructor(Position.NOPOS, mods)); + } else { + constr.flags = mods; + } setParamOwners(mtype, constr); constr.setInfo(mtype); // System.out.println(clazz.allConstructors() + ": " diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index 406f79f54a..bdb76e7b71 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -208,7 +208,7 @@ public class ClassfileParser implements ClassfileConstants { Name name = (Name)pool.readPool(in.nextChar()); Type type = readType(in.nextChar()); if (CONSTR_N.equals(name)) { - Symbol s = TermSymbol.newConstructor(c, sflags); + Symbol s = c.newConstructor(Position.NOPOS, sflags); // kick out package visible or private constructors if (((flags & JAVA_ACC_PRIVATE) != 0) || ((flags & (JAVA_ACC_PROTECTED | JAVA_ACC_PUBLIC)) == 0)) { @@ -223,9 +223,11 @@ public class ClassfileParser implements ClassfileConstants { throw new ApplicationError(); } Symbol constr = c.primaryConstructor(); - if (constr.isInitialized()) - constr = c.addConstructor(); - s.copyTo(constr); + if (constr.isInitialized()) { + c.addConstructor(constr = s); + } else { + constr.flags = sflags; + } setParamOwners(type, constr); constr.setInfo(type); attrib.readAttributes(constr, type, METH_ATTR); diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java index 9a1f820385..3359e9aac7 100644 --- a/sources/scalac/symtab/classfile/Pickle.java +++ b/sources/scalac/symtab/classfile/Pickle.java @@ -117,7 +117,7 @@ public class Pickle implements Kinds, Modifiers, EntryTags { if (debug) System.out.println("put " + sym); if (isLocal(sym)) { putEntry(sym.name); - putSymbol(sym.owner()); + putSymbol(sym.isConstructor() ? sym.constructorClass() : sym.owner()); putType(sym.info()); switch (sym.kind) { case TYPE: @@ -330,7 +330,7 @@ public class Pickle implements Kinds, Modifiers, EntryTags { } writeByte(0); // space for length writeRef(sym.name); - writeRef(sym.owner()); + writeRef(sym.isConstructor() ? sym.constructorClass() : sym.owner()); writeNat(sym.flags); writeRef(sym.info()); switch (sym.kind) { diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java index 3a3b8fa2a6..c309ed5723 100644 --- a/sources/scalac/symtab/classfile/UnPickle.java +++ b/sources/scalac/symtab/classfile/UnPickle.java @@ -253,9 +253,6 @@ public class UnPickle implements Kinds, Modifiers, EntryTags, TypeTags { sym.setTypeOfThis(readTypeRef()); Symbol constr = readSymbolRef(); assert constr == sym.allConstructors(); - Symbol[] alts = constr.alternativeSymbols(); - for (int i = 0; i < alts.length; i++) - ((TermSymbol)alts[i]).makeConstructor((ClassSymbol)sym); break; case VALsym: @@ -266,8 +263,13 @@ public class UnPickle implements Kinds, Modifiers, EntryTags, TypeTags { entries[n] = sym = moduleroot; sym.flags = flags; } else if (tsym == null) { - entries[n] = sym = new TermSymbol( - Position.NOPOS, name, owner, flags); + if (name == Names.CONSTRUCTOR) { + entries[n] = sym = owner.newConstructor( + Position.NOPOS, flags); + } else { + entries[n] = sym = new TermSymbol( + Position.NOPOS, name, owner, flags); + } } else { if (name == Names.CONSTRUCTOR) { entries[n] = sym = tsym.allConstructors(); |