summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/classfile
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/symtab/classfile')
-rw-r--r--sources/scalac/symtab/classfile/CLRClassParser.java8
-rw-r--r--sources/scalac/symtab/classfile/ClassfileParser.java10
-rw-r--r--sources/scalac/symtab/classfile/Pickle.java4
-rw-r--r--sources/scalac/symtab/classfile/UnPickle.java12
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();