diff options
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/Global.java | 1 | ||||
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 6 | ||||
-rw-r--r-- | sources/scalac/backend/msil/TypeCreator.java | 5 | ||||
-rw-r--r-- | sources/scalac/symtab/Scope.java | 98 | ||||
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 113 | ||||
-rw-r--r-- | sources/scalac/symtab/SymbolCloner.java | 6 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 4 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassfileParser.java | 5 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/Pickle.java | 7 | ||||
-rw-r--r-- | sources/scalac/transformer/AddInterfaces.java | 9 | ||||
-rw-r--r-- | sources/scalac/transformer/AddInterfacesPhase.java | 4 | ||||
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 54 | ||||
-rw-r--r-- | sources/scalac/transformer/ExpandMixinsPhase.java | 3 | ||||
-rw-r--r-- | sources/scalac/transformer/TypesAsValuesPhase.java | 3 | ||||
-rw-r--r-- | sources/scalac/util/Debug.java | 2 |
15 files changed, 128 insertions, 192 deletions
diff --git a/sources/scalac/Global.java b/sources/scalac/Global.java index 9b50265f06..e164dec350 100644 --- a/sources/scalac/Global.java +++ b/sources/scalac/Global.java @@ -377,6 +377,7 @@ public abstract class Global { while (currentPhase.next != null && reporter.errors() == 0) { currentPhase = currentPhase.next; start(); + // System.out.println("*** " + currentPhase.descriptor.description() + " ***"); // !!! new scalac.checkers.SymbolChecker(this).check(); currentPhase.apply(units); stop(currentPhase.descriptor.taskDescription()); diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java index d9dc030646..16556792c0 100644 --- a/sources/scalac/backend/jvm/GenJVM.java +++ b/sources/scalac/backend/jvm/GenJVM.java @@ -1317,7 +1317,7 @@ class GenJVM { JClass.NO_INTERFACES, ctx.sourceFileName); Scope.SymbolIterator memberIt = - new Scope.UnloadIterator(cSym.members().iterator()); + cSym.members().iterator(); while (memberIt.hasNext()) { Symbol member = memberIt.next(); if (!member.isMethod() || member.isInitializer()) @@ -1701,7 +1701,7 @@ class GenJVM { protected void addValueClassMembers(Context ctx, Tree.ClassDef cDef) { Symbol cSym = cDef.symbol(); Scope.SymbolIterator memberIt = - new Scope.UnloadIterator(cSym.members().iterator()); + cSym.members().iterator(); while (memberIt.hasNext()) { Symbol member = memberIt.next(); if (member.isTerm() && !member.isMethod()) @@ -1722,7 +1722,7 @@ class GenJVM { Phase bkpCurrent = global.currentPhase; global.currentPhase = refCheckPhase; Scope.SymbolIterator memberIt = - new Scope.UnloadIterator(iSym.members().iterator()); + iSym.members().iterator(); while (memberIt.hasNext()) { Symbol member = memberIt.next(); if (member.isTerm() && !member.isMethod() && member.isPrivate()) diff --git a/sources/scalac/backend/msil/TypeCreator.java b/sources/scalac/backend/msil/TypeCreator.java index 35c01d4615..1ddda5432e 100644 --- a/sources/scalac/backend/msil/TypeCreator.java +++ b/sources/scalac/backend/msil/TypeCreator.java @@ -790,7 +790,7 @@ final class TypeCreator { if (clazz.isModuleClass() && staticType != null) { syms2staticTypes.put(clazz, staticType); } - for (Scope.SymbolIterator syms = clazz.members().iterator(true); + for (Scope.SymbolIterator syms = clazz.members().iterator(); syms.hasNext(); ) { Symbol member = syms.next(); @@ -815,7 +815,8 @@ final class TypeCreator { ifaces.removeAll(getInterfacesOf(svper)); for (Iterator i = ifaces.iterator(); i.hasNext(); ) { Symbol iface = (Symbol)i.next(); - for (Scope.SymbolIterator members = iface.members().iterator(true); + for (Scope.SymbolIterator members = + iface.members().iterator(); members.hasNext(); ) { Symbol method = members.next(); diff --git a/sources/scalac/symtab/Scope.java b/sources/scalac/symtab/Scope.java index cc76b5ab1d..f609bbf64a 100644 --- a/sources/scalac/symtab/Scope.java +++ b/sources/scalac/symtab/Scope.java @@ -13,48 +13,9 @@ import scalac.ApplicationError; public class Scope { - public static abstract class SymbolIterator { - public abstract boolean hasNext(); - public abstract Symbol next(); - } - - /** A symbol iterator that returns all alternatives of an overloaded symbol - * instead of the overloaded symbol itself. - */ - public static class UnloadIterator extends SymbolIterator { - private SymbolIterator iterator; - private Symbol[] alternatives; - private int index; - - public UnloadIterator(SymbolIterator iterator) { - this.iterator = iterator; - this.alternatives = null; - this.index = -1; - } - - public boolean hasNext() { - return index >= 0 || iterator.hasNext(); - } - public Symbol next() { - if (index >= 0) { - Symbol symbol = alternatives[index++]; - if (index == alternatives.length) { - alternatives = null; - index = -1; - } - return symbol; - } else { - Symbol symbol = iterator.next(); - switch (symbol.type()) { - case OverloadedType(Symbol[] alts, _): - alternatives = alts; - index = 0; - return next(); - default: - return symbol; - } - } - } + public abstract static class SymbolIterator { + public abstract boolean hasNext(); + public abstract Symbol next(); } public static class Entry { @@ -198,6 +159,7 @@ public class Scope { // assert !sym.isConstructor(); return enter(new Entry(sym, this)); } + public final Scope enterNoHide(Symbol sym) { assert lookupEntry(sym.name) == Entry.NONE: sym + " hides " + lookup(sym.name); @@ -296,33 +258,45 @@ public class Scope { return elemsCache; } - /** return all symbols as an iterator, - * in the order they were entered in this scope. - */ - public SymbolIterator iterator() { return new MySymbols(); } + class MySymbolIterator extends SymbolIterator { + private Symbol[] alternatives = Symbol.EMPTY_ARRAY; + private int altindex = 0; + private int elemindex = 0; - public SymbolIterator iterator(boolean unload) { - SymbolIterator iterator = iterator(); - return unload ? new UnloadIterator(iterator) : iterator; - } - - class MySymbols extends SymbolIterator { - - private int index; - MySymbols() { + public MySymbolIterator() { elements(); - index = 0; - } + } - public boolean hasNext() { - return index < elemsCache.length; + public boolean hasNext() { + return altindex < alternatives.length || + elemindex < elemsCache.length; } - public Symbol next() { - return elemsCache[index++]; - } + public Symbol next() { + if (altindex < alternatives.length) + return alternatives[altindex++]; + else { + Symbol sym = elemsCache[elemindex++]; + switch (sym.type()) { + case OverloadedType(Symbol[] alts, _): + alternatives = alts; + altindex = 0; + return next(); + default: + return sym; + } + } + } + } + + /** return all symbols as an iterator, + * in the order they were entered in this scope. + */ + public SymbolIterator iterator() { + return new MySymbolIterator(); } + public String toString() { return new SymbolTablePrinter().printScope(this).toString(); } diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 5c518bc65c..586daeff92 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -804,10 +804,10 @@ public abstract class Symbol implements Modifiers, Kinds { /** Is this symbol an overloaded symbol? */ public final boolean isOverloaded() { - switch (info()) { - case OverloadedType(_,_): return true; - default : return false; - } + Type tp = rawInfo(); + return + tp instanceof Type.OverloadedType || + tp instanceof LazyOverloadedType; } /** Does this symbol denote a label? */ @@ -983,21 +983,6 @@ public abstract class Symbol implements Modifiers, Kinds { return this; } - /** Return first alternative if this has a (possibly lazy) - * overloaded type, otherwise symbol itself. - * Needed in ClassSymbol.primaryConstructor() and in UnPickle. - */ - public Symbol firstAlternative() { - if (infos == null) - return this; - else if (infos.info instanceof Type.OverloadedType) - return infos.info.alternativeSymbols()[0]; - else if (infos.info instanceof LazyOverloadedType) - return ((LazyOverloadedType) infos.info).sym1.firstAlternative(); - else - return this; - } - /** * Returns the class of this module. This method may be invoked * only on module symbols. It returns always a non-null module @@ -1519,25 +1504,27 @@ public abstract class Symbol implements Modifiers, Kinds { // Overloading and Overriding ------------------------------------------- + /** Return first alternative if this has a (possibly lazy) + * overloaded type, otherwise symbol itself. + * Needed in ClassSymbol.primaryConstructor() and in UnPickle. + */ + public Symbol firstAlternative() { + if (infos == null) + return this; + else if (infos.info instanceof Type.OverloadedType) { + Symbol result = infos.info.alternativeSymbols()[0]; + assert !result.isOverloaded(); + return result; + } else if (infos.info instanceof LazyOverloadedType) + return ((LazyOverloadedType) infos.info).sym1.firstAlternative(); + else + return this; + } + /** Add another overloaded alternative to this symbol. */ public Symbol overloadWith(Symbol that) { - assert isTerm() : Debug.show(this); - assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that); - //assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that); - assert this.isConstructor() == that.isConstructor(); - int overflags; - //if (this.owner == that.owner) - overflags = (this.flags & that.flags & - (JAVA | ACCESSFLAGS | DEFERRED | PARAM | SYNTHETIC)) | - ((this.flags | that.flags) & ACCESSOR); - // else // it's an inherited overloaded alternative - // overflags = this.flags & SOURCEFLAGS; - Symbol overloaded = (this.isConstructor()) - ? this.constructorClass().newConstructor(this.constructorClass().pos, overflags) - : owner.newTerm(pos, overflags, name, 0); - overloaded.setInfo(new LazyOverloadedType(this, that)); - return overloaded; + throw new ApplicationError("overloadWith inapplicable for " + this); } /** A lazy type which, when forced computed the overloaded type @@ -1743,6 +1730,26 @@ class TermSymbol extends Symbol { return new TermSymbol(owner, pos, flags, name, attrs); } + /** Add another overloaded alternative to this symbol. + */ + public Symbol overloadWith(Symbol that) { + assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that); + //assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that); + assert this.isConstructor() == that.isConstructor(); + + int overflags; + //if (this.owner == that.owner) + overflags = (this.flags & that.flags & + (JAVA | ACCESSFLAGS | DEFERRED | PARAM | SYNTHETIC)) | + ((this.flags | that.flags) & ACCESSOR); + // else // it's an inherited overloaded alternative + // overflags = this.flags & SOURCEFLAGS; + Symbol overloaded = (this.isConstructor()) + ? this.constructorClass().newConstructor(this.constructorClass().pos, overflags) + : owner().newTerm(pos, overflags, name, 0); + overloaded.setInfo(new LazyOverloadedType(this, that)); + return overloaded; + } } /** A class for constructor symbols */ @@ -2110,24 +2117,24 @@ public class ClassSymbol extends TypeSymbol { Scope.SymbolIterator it = info().members().iterator(); Symbol sym = null; if ((flags & JAVA) == 0) { - for (int i = 0; i <= index; i++) { - do { - sym = it.next(); - } while (sym.kind != VAL || (sym.flags & CASEACCESSOR) == 0 || !sym.isMethod()); - } - //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG - } else { - sym = it.next(); - while ((sym.flags & SYNTHETIC) == 0) { - //System.out.println("skipping " + sym); - sym = it.next(); - } - for (int i = 0; i < index; i++) - sym = it.next(); - //System.out.println("field accessor = " + sym);//DEBUG - } - assert sym != null : this; - return sym; + for (int i = 0; i <= index; i++) { + do { + sym = it.next(); + } while (sym != NONE && sym.kind != VAL || (sym.flags & CASEACCESSOR) == 0 || !sym.isMethod()); + } + //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG + } else { + sym = it.next(); + while (sym != NONE && (sym.flags & SYNTHETIC) == 0) { + //System.out.println("skipping " + sym); + sym = it.next(); + } + for (int i = 0; i < index; i++) + sym = it.next(); + //System.out.println("field accessor = " + sym);//DEBUG + } + assert sym != null : this; + return sym; } public final Symbol rebindSym() { diff --git a/sources/scalac/symtab/SymbolCloner.java b/sources/scalac/symtab/SymbolCloner.java index f7dd1ad182..a1a534fab6 100644 --- a/sources/scalac/symtab/SymbolCloner.java +++ b/sources/scalac/symtab/SymbolCloner.java @@ -90,7 +90,8 @@ public class SymbolCloner { /** Clones the given scope but not the type of its members. */ public Scope cloneScopeWithoutTypes(Scope scope) { Scope clone = new Scope(); - for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext(); ) { + for (Scope.SymbolIterator i = scope.iterator(); + i.hasNext(); ) { clone.enterOrOverload(cloneSymbolWithoutType(i.next())); } return clone; @@ -114,7 +115,8 @@ public class SymbolCloner { /** Clones the given scope and the type of its members. */ public Scope cloneScope(Scope scope) { Scope clone = cloneScopeWithoutTypes(scope); - for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext(); ) { + for (Scope.SymbolIterator i = scope.iterator(); + i.hasNext(); ) { Symbol member = i.next(); member.setType(cloneType(member.info())); } diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 65bb56a73a..f0ebe88b1e 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -2076,7 +2076,8 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { /** Does this type implement all symbols in scope `s' with same or stronger types? */ public boolean specializes(Scope s) { - for (Scope.SymbolIterator it = s.iterator(true); it.hasNext();) { + for (Scope.SymbolIterator it = s.iterator(); + it.hasNext();) { if (!specializes(it.next())) return false; } return true; @@ -2309,6 +2310,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { private boolean isSubScope(Scope s1, Scope s2) { for (Scope.SymbolIterator it = s2.iterator(); it.hasNext(); ) { Symbol sym2 = it.next(); + // todo: handle overloaded Symbol sym1 = s1.lookup(sym2.name); if (sym1.kind != sym2.kind || !sym1.info().isSameAs( diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index a3470f4964..073df39e90 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -165,7 +165,7 @@ public class ClassfileParser implements ClassfileConstants { if (m.isJava() && superclass.isJava()) { Symbol mclass = m.moduleClass(); SymbolIterator i = superclass.linkedModule().moduleClass() - .members().iterator(true); + .members().iterator(); outer: while (i.hasNext()) { Symbol member = i.next(); @@ -190,8 +190,9 @@ public class ClassfileParser implements ClassfileConstants { private void addInheritedOverloaded() { Symbol[] elems = c.members().elements(); - for (int i = 0; i < elems.length; i++) + for (int i = 0; i < elems.length; i++) { addInheritedOverloaded(elems[i]); + } } private void addInheritedOverloaded(Symbol sym) { diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java index 4bb9419b2b..17245a7eec 100644 --- a/sources/scalac/symtab/classfile/Pickle.java +++ b/sources/scalac/symtab/classfile/Pickle.java @@ -133,9 +133,10 @@ public class Pickle implements Kinds, Modifiers, EntryTags { if (sym.isModuleClass()) putSymbol(sym.sourceModule()); putType(sym.typeOfThis()); putSymbol(sym.allConstructors()); - for (Scope.SymbolIterator it = sym.members().iterator(); - it.hasNext();) - putSymbol(it.next()); + Symbol[] elems = sym.members().elements(); + for (int i = 0; i < elems.length; i++) + putSymbol(elems[i]); + break; case VAL: putType(sym.removeInheritedOverloaded(sym.info())); diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java index a54bcc95e8..1f4b057ee4 100644 --- a/sources/scalac/transformer/AddInterfaces.java +++ b/sources/scalac/transformer/AddInterfaces.java @@ -227,13 +227,8 @@ public class AddInterfaces extends GenTransformer { */ private Tree getClassTree(Symbol clasz, TreeList body, Map methods) { Scope members = clasz.nextInfo().members(); - /* - for (Scope.SymbolIterator i = members.iterator(false); i.hasNext(); ) { - Symbol sym = i.next(); - System.out.println(clasz + " defines " + sym + ":" + sym.getType()); - } - */ - for (Scope.SymbolIterator i = members.iterator(true); i.hasNext(); ) { + for (Scope.SymbolIterator i = members.iterator(); + i.hasNext(); ) { Symbol member = i.next(); if (!member.isTerm()) continue; body.append(getMemberTree(clasz, member, methods)); diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java index 9b7ebf6675..6cf968bfef 100644 --- a/sources/scalac/transformer/AddInterfacesPhase.java +++ b/sources/scalac/transformer/AddInterfacesPhase.java @@ -49,7 +49,7 @@ public class AddInterfacesPhase extends Phase { Scope newMembers = new Scope(); Scope.SymbolIterator oldMembersIt = - new Scope.UnloadIterator(tp.members().iterator()); + tp.members().iterator(); while (oldMembersIt.hasNext()) { Symbol member = oldMembersIt.next(); @@ -186,7 +186,7 @@ public class AddInterfacesPhase extends Phase { // Clone all members, entering them in the class scope. Scope classMembers = new Scope(); Scope.SymbolIterator ifaceMembersIt = - new Scope.UnloadIterator(ifaceSym.members().iterator()); + ifaceSym.members().iterator(); while (ifaceMembersIt.hasNext()) { Symbol ifaceMemberSym = ifaceMembersIt.next(); diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index d200aab112..ea77bdf926 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -113,7 +113,6 @@ public class Erasure extends GenTransformer implements Modifiers { case ClassDef(_, _, _, _, _, Template(_, Tree[] body)): Symbol clasz = tree.symbol(); TreeList members = new TreeList(transform(body)); - checkOverloadedTermsOf(clasz); addBridges(clasz, members); return gen.ClassDef(clasz, members.toArray()); @@ -570,56 +569,6 @@ public class Erasure extends GenTransformer implements Modifiers { throw Debug.abort("non-array type", type); } - //######################################################################## - // Private Methods - Overlapping signatures detection - - /** - * Checks that overloaded terms of the given class have no - * overlapping erased signatures. - */ - private void checkOverloadedTermsOf(Symbol clasz) { - // !!! we might also accidentally override an inherited method ! - for (SymbolIterator si = clasz.members().iterator(); si.hasNext(); ) { - Symbol symbol = si.next(); - if (!symbol.isTerm()) continue; - switch (symbol.info()) { - case OverloadedType(Symbol[] symbols, _): - Type[] types = new Type[symbols.length]; - for (int i = 0; i < symbols.length; i++) { - types[i] = symbols[i].nextType(); - for (int j = 0; j < i; j++) { - if (!isSameAs(types[i], types[j])) continue; - errorOverlappingSignatures(symbols[j], symbols[i]); - break; - } - } - } - } - } - - /** Reports an overlapping signature error for given symbols. */ - private void errorOverlappingSignatures(Symbol symbol1, Symbol symbol2) { - SymbolTablePrinter printer = new SymbolTablePrinter(" "); - printer.print("overlapping overloaded alternatives;").space(); - printer.print("the two following alternatives of").space(); - printer.printSymbolKindAndName(symbol1).space(); - printer.print("have the same erasure:").space(); - printer.printType(symbol1.nextType()); - Phase phase = global.currentPhase; - global.currentPhase = global.PHASE.ANALYZER.phase(); - printer.indent(); - printer.line().print("alternative 1:").space().printSignature(symbol1); - printer.line().print("alternative 2:").space().printSignature(symbol2); - printer.undent(); - global.currentPhase = phase; - unit.error(symbol2.pos, printer.toString()); - } - - //######################################################################## - //######################################################################## - //######################################################################## - //######################################################################## - ////////////////////////////////////////////////////////////////////////////////// // Bridge Building ///////////////////////////////////////////////////////////////////////////////// @@ -732,7 +681,8 @@ public class Erasure extends GenTransformer implements Modifiers { } private void addInterfaceBridgesAux(Symbol owner, Scope symbols) { - for (Scope.SymbolIterator i = symbols.iterator(true); i.hasNext();) { + for (Scope.SymbolIterator i = symbols.iterator(); + i.hasNext();) { Symbol member = i.next(); if (!member.isTerm() || !member.isDeferred()) continue; addInterfaceBridges(owner, member); diff --git a/sources/scalac/transformer/ExpandMixinsPhase.java b/sources/scalac/transformer/ExpandMixinsPhase.java index e43ed7b975..57c94a8708 100644 --- a/sources/scalac/transformer/ExpandMixinsPhase.java +++ b/sources/scalac/transformer/ExpandMixinsPhase.java @@ -394,7 +394,8 @@ public class ExpandMixinsPhase extends Phase { private void createMixedInMemberSymbols(Scope symbols) { Scope scope = clasz.members(); - for (SymbolIterator i = symbols.iterator(true); i.hasNext();) { + for (SymbolIterator i = symbols.iterator(); + i.hasNext();) { Symbol member = i.next(); boolean shadowed = member.isPrivate() || member.isInitializer() || member.overridingSymbol(clasz.thisType()) != member; diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java index d3147ad981..d5b07dd28d 100644 --- a/sources/scalac/transformer/TypesAsValuesPhase.java +++ b/sources/scalac/transformer/TypesAsValuesPhase.java @@ -100,7 +100,8 @@ public class TypesAsValuesPhase extends Phase { if (newSymbols == null) { newSymbols = new HashMap(); - Scope.SymbolIterator membersIt = classSym.members().iterator(true); + Scope.SymbolIterator membersIt = + classSym.members().iterator(); while (membersIt.hasNext()) { Symbol member = membersIt.next(); if (member.isType() /*&& !member.isClass()*/) { diff --git a/sources/scalac/util/Debug.java b/sources/scalac/util/Debug.java index 226c4668b8..ec688671a1 100644 --- a/sources/scalac/util/Debug.java +++ b/sources/scalac/util/Debug.java @@ -234,7 +234,7 @@ public class ScopeDebugger implements Debugger { public void append(StringBuffer buffer, Object object) { Scope scope = (Scope)object; buffer.append('{'); - for (Scope.SymbolIterator i = scope.iterator(true); i.hasNext();) { + for (Scope.SymbolIterator i = scope.iterator(); i.hasNext();) { Debug.append(buffer, i.next()); if (i.hasNext()) buffer.append(','); } |