diff options
24 files changed, 150 insertions, 256 deletions
diff --git a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala index 98b5d35119..6d1982c948 100644 --- a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala +++ b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala @@ -634,7 +634,7 @@ class TextTreePrinter(writer: PrintWriter) with TreePrinter { if (symbol != null) { val global: scalac_Global = scalac_Global.instance; if (global.currentPhase.id > global.PHASE.EXPLICITOUTER.id()) { - val i: Scope$SymbolIterator = symbol.members().iterator(true); + val i: Scope$SymbolIterator = symbol.members().iterator(); while (i.hasNext()) { val member: Symbol = i.next(); if (member.isTypeAlias() || member.isAbstractType()) diff --git a/sources/scala/tools/scalac/transformer/UnCurry.scala b/sources/scala/tools/scalac/transformer/UnCurry.scala index 9502703759..41f159beab 100644 --- a/sources/scala/tools/scalac/transformer/UnCurry.scala +++ b/sources/scala/tools/scalac/transformer/UnCurry.scala @@ -116,8 +116,11 @@ class UnCurry(global: scalac_Global, descr: UnCurryPhase) extends OwnerTransform tree match { case Tree$ClassDef(_, _, tparams, vparams, tpe, impl) => val clazz: Symbol = tree.symbol(); - val it = clazz.members().iterator(); - while (it.hasNext()) checkNoDoubleDef(clazz, it.next()); + val elems = clazz.members().elements(); + var i = 0; while (i < elems.length) { + checkNoDoubleDef(clazz, elems(i)); + i = i + 1 + } copy.ClassDef( tree, clazz, tparams, uncurry(transform(vparams, clazz)), diff --git a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala b/sources/scala/tools/scalac/transformer/UnCurryPhase.scala index 54789a84fb..5445d89cf5 100644 --- a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala +++ b/sources/scala/tools/scalac/transformer/UnCurryPhase.scala @@ -67,10 +67,11 @@ class UnCurryPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends P base case Type$CompoundType(parents, scope) => val symbol = tp.symbol(); + // todo: why not remove all inherited alternatives here? if (!symbol.isClass() || symbol.isCompoundSym()) tp else { val clone = new Scope(); - val it = scope.iterator(true); + val it = scope.iterator(); while (it.hasNext()) { val member = it.next(); if (!isUnaccessedConstant(member) && diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index 888dfe0c9f..81ef8f414f 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -1927,11 +1927,12 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( val templ1: Tree$Template = copy.Template(templ, parents, body1); templ1.setType(owner.getType()); // initialize all members; necessary to initialize overloaded symbols - val members = owner.members().iterator(false); - while (members.hasNext()) { - val sym = members.next(); + val members: Array[Symbol] = owner.members().elements(); + var i = 0; while (i < members.length) { + val sym = members(i); sym.initialize(); //System.out.println(owner.toString() + " defines " + sym + ":" + sym.getType());//DEBUG + i = i + 1 } templ1 } diff --git a/sources/scala/tools/scalac/typechecker/RefCheck.scala b/sources/scala/tools/scalac/typechecker/RefCheck.scala index fd997b4035..f97b1f77fd 100755 --- a/sources/scala/tools/scalac/typechecker/RefCheck.scala +++ b/sources/scala/tools/scalac/typechecker/RefCheck.scala @@ -86,16 +86,14 @@ class RefCheck(globl: scalac.Global) extends Transformer(globl) { var i = 0; while (i < closure.length) { val basetype = closure(i); val baseclazz = basetype.symbol(); - val it = basetype.members().iterator(true); - while (it.hasNext()) { - val sym = it.next(); - if (sym.owner() == baseclazz) checkOverride(pos, clazz, sym); - } + val it = basetype.members().iterator(); + while (it.hasNext()) + checkOverride(pos, clazz, it.next()); i = i + 1 } val parents = clazz.info().parents(); - val it = clazz.members().iterator(true); + val it = clazz.members().iterator(); while (it.hasNext()) { val sym = it.next(); if ((sym.flags & OVERRIDE) != 0 && sym.owner() == clazz) { diff --git a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala index 029600a6d3..eb04b72f27 100644 --- a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala +++ b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala @@ -353,7 +353,7 @@ class MonomorphicCallSites(globall: scalac_Global, application: Set[Symbol]) { // walk all subclasses hierarchy.getInEdges(cls).foreach( (e) => { val c = hierarchy.nodes(e.from).info; - val it = c.members().iterator(true); + val it = c.members().iterator(); while (it.hasNext()) { val m = it.next(); diff --git a/sources/scala/tools/scaladoc/HTMLGenerator.java b/sources/scala/tools/scaladoc/HTMLGenerator.java index 72d6d5a0ca..8894586ba7 100644 --- a/sources/scala/tools/scaladoc/HTMLGenerator.java +++ b/sources/scala/tools/scaladoc/HTMLGenerator.java @@ -1850,7 +1850,7 @@ public abstract class HTMLGenerator { // look for a member in the scope that has a tag // @label with the given label Scope scope = sym.moduleClass().members(); - SymbolIterator it = scope.iterator(true); + SymbolIterator it = scope.iterator(); while (it.hasNext()) { Symbol member = (Symbol) it.next(); Tag[] tags = getComment(member).tags; diff --git a/sources/scala/tools/scaladoc/ScalaSearch.java b/sources/scala/tools/scaladoc/ScalaSearch.java index bb4165dfbc..94b8deaea2 100644 --- a/sources/scala/tools/scaladoc/ScalaSearch.java +++ b/sources/scala/tools/scaladoc/ScalaSearch.java @@ -106,51 +106,6 @@ public class ScalaSearch { !isPhantom(sym); } - //////////////////////// SCOPE ITERATOR ////////////////////////////// - - /** A symbol iterator that returns all alternatives of an overloaded symbol - * instead of the overloaded symbol itself (does not unload lazy symbols). - */ - public static class UnloadLazyIterator extends SymbolIterator { - private SymbolIterator iterator; - private Symbol[] alternatives; - private int index; - - public UnloadLazyIterator(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(); - if (isLazy(symbol)) - return symbol; - else { - switch (symbol.type()) { - case OverloadedType(Symbol[] alts, _): - alternatives = alts; - index = 0; - return next(); - default: - return symbol; - } - } - } - } - } - ////////////////////////// TRAVERSER /////////////////////////////// /** Function from Symbol to void. @@ -177,7 +132,7 @@ public class ScalaSearch { if (isContainer(sym) && !isLazy(sym)) { List memberList = new LinkedList(); SymbolIterator i = - new UnloadLazyIterator(sym.members().iterator(false)); + sym.members().iterator(); while (i.hasNext()) { Symbol member = i.next(); if (isRelevant(member)) @@ -209,7 +164,7 @@ public class ScalaSearch { if (isContainer(sym) && !isLazy(sym)) { List memberList = new LinkedList(); SymbolIterator i = - new UnloadLazyIterator(sym.members().iterator(false)); + sym.members().iterator(); while (i.hasNext()) { Symbol member = i.next(); if (isDocumented.apply(member) && isRelevant(sym)) @@ -480,7 +435,7 @@ public class ScalaSearch { protected static void collectNames(Type tpe, List/*<Name>*/ names) { // local members SymbolIterator it = - new UnloadLazyIterator(tpe.members().iterator(false)); + tpe.members().iterator(); while (it.hasNext()) { Name name = ((Symbol) it.next()).name; if (!names.contains(name)) diff --git a/sources/scala/tools/scalai/Environment.java b/sources/scala/tools/scalai/Environment.java index 1a1a056975..0099bcff3f 100644 --- a/sources/scala/tools/scalai/Environment.java +++ b/sources/scala/tools/scalai/Environment.java @@ -228,7 +228,7 @@ public class Environment { private void loadTemplateOverrides(Symbol symbol) { Type[] bases = symbol.parents(); - SymbolIterator i = symbol.members().iterator(true); + SymbolIterator i = symbol.members().iterator(); while (i.hasNext()) loadMethodOverride(bases, i.next()); } 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(','); } |