diff options
author | paltherr <paltherr@epfl.ch> | 2004-08-30 16:58:35 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2004-08-30 16:58:35 +0000 |
commit | 09c6eecd0856f95f2cdc22505f773634ddf230c0 (patch) | |
tree | 6d967138252688561d14d4d5582bd36467274909 | |
parent | 99d2c0a5dbd378e9f64e90dea53237f9e004cb62 (diff) | |
download | scala-09c6eecd0856f95f2cdc22505f773634ddf230c0.tar.gz scala-09c6eecd0856f95f2cdc22505f773634ddf230c0.tar.bz2 scala-09c6eecd0856f95f2cdc22505f773634ddf230c0.zip |
- Made creation of outer fields lazy
-rw-r--r-- | sources/scalac/transformer/ExplicitOuterClassesPhase.java | 87 |
1 files changed, 28 insertions, 59 deletions
diff --git a/sources/scalac/transformer/ExplicitOuterClassesPhase.java b/sources/scalac/transformer/ExplicitOuterClassesPhase.java index 266f62bbd9..e818b3d19c 100644 --- a/sources/scalac/transformer/ExplicitOuterClassesPhase.java +++ b/sources/scalac/transformer/ExplicitOuterClassesPhase.java @@ -46,15 +46,11 @@ import scalac.util.Names; * - Adds all missing qualifiers. */ // !!! needs to be cleaned -// !!! create outer fields lazyly public class ExplicitOuterClassesPhase extends Phase { //######################################################################## // Private Fields - /** A map from class symbols to class contexts */ - private final Map/*<Symbol,ClassContext>*/ classes = new HashMap(); - /** A map from constructor symbols to type contexts */ private final Map/*<Symbol,TypeContext>*/ contexts = new HashMap(); @@ -119,30 +115,6 @@ public class ExplicitOuterClassesPhase extends Phase { //######################################################################## // Private Methods - /** Returns the class context for the given symbol. */ - private ClassContext getClassContext(Symbol clasz, TypeContext outer) { - assert clasz.isClassType(): Debug.show(clasz); - ClassContext context = (ClassContext)classes.get(clasz); - if (context == null) { - context = createClassContext(clasz, outer); - classes.put(clasz, context); - } - return context; - } - - /** Creates the context for the given class. */ - private ClassContext createClassContext(Symbol clasz, TypeContext outer) { - // create outer value link - Symbol vfield = null; - if (outer != null) { - int vflags = Modifiers.SYNTHETIC | Modifiers.PRIVATE | Modifiers.STABLE; - vfield = clasz.newField(clasz.pos, vflags, Names.OUTER(clasz)); - vfield.setInfo(outer.clasz.thisType()); - clasz.members().enter(vfield); - } - return new ClassContext(vfield); - } - /** Returns the type context for the given symbol. */ private TypeContext getTypeContextFor(Symbol symbol) { while (true) { @@ -157,7 +129,7 @@ public class ExplicitOuterClassesPhase extends Phase { // symbol = symbol.owner(); if (symbol.isClassType()) symbol = symbol.primaryConstructor(); - if (symbol.constructorClass().isPackageClass()) return new TypeContext(null, null, null, null, null, null, Collections.EMPTY_MAP); // !!! + if (symbol.constructorClass().isPackageClass()) return new TypeContext(null, null, null, null, null, Collections.EMPTY_MAP); // !!! TypeContext context = (TypeContext)contexts.get(symbol); if (context == null) { context = createTypeContext(symbol); @@ -190,13 +162,11 @@ public class ExplicitOuterClassesPhase extends Phase { // create outer value link Symbol vlink = null; - ClassContext context = null; if (outer != null) { int vflags = Modifiers.SYNTHETIC; Name vname = Names.OUTER(constructor); vlink = constructor.newVParam(constructor.pos, vflags, vname); vlink.setInfo(outer.clasz.thisType()); - context = getClassContext(clasz, outer); } // create new type parameters @@ -217,7 +187,7 @@ public class ExplicitOuterClassesPhase extends Phase { tparams.put(oldtparam, newtparam.type()); } - return new TypeContext(clasz, outer, tlinks, vlink, context, constructor.typeParams(), tparams); + return new TypeContext(clasz, outer, tlinks, vlink, constructor.typeParams(), tparams); } //######################################################################## @@ -288,21 +258,6 @@ public class ExplicitOuterClassesPhase extends Phase { } //######################################################################## - // Private Class - Class context - - private class ClassContext { - - /** The outer value field (null if all outer contexts are stable) */ - private final Symbol vfield; - - /** !!! */ - public ClassContext(Symbol vfield) { - this.vfield = vfield; - } - - } - - //######################################################################## // Private Class - Type transformer context private class TypeContext { @@ -315,8 +270,6 @@ public class ExplicitOuterClassesPhase extends Phase { private final Symbol[] tlinks; /** The outer value link (null if all outer contexts are stable) */ private final Symbol vlink; - /** !!! */ - private final ClassContext context; private final int depth; @@ -328,12 +281,11 @@ public class ExplicitOuterClassesPhase extends Phase { private TypeTransformer transformer; // !!! type /** !!! */ - public TypeContext(Symbol clasz, TypeContext outer, Symbol[] tlinks, Symbol vlink, ClassContext context, Symbol[] oldtparams, Map tparams) { + public TypeContext(Symbol clasz, TypeContext outer, Symbol[] tlinks, Symbol vlink, Symbol[] oldtparams, Map tparams) { this.clasz = clasz; this.outer = outer; this.tlinks = tlinks; this.vlink = vlink; - this.context = context; this.depth = outer == null ? 0 : outer.depth + 1; this.oldtparams = oldtparams; this.transformer = new TypeTransformer(tparams); @@ -434,13 +386,11 @@ public class ExplicitOuterClassesPhase extends Phase { Tree[] body = transform(impl.body); body = Tree.concat(body, genAccessMethods(false)); body = Tree.concat(body, genAccessMethods(true)); - if (context.context.vlink != null) { + if (context.vfield != null) { body = Tree.cloneArray(1, body); body[0] = gen.ValDef( - context.context.context.vfield, - gen.Ident( - context.context.context.vfield.pos, - context.context.vlink)); + context.vfield, + gen.Ident(context.vfield.pos, context.context.vlink)); } context = context.outer; return gen.ClassDef(clasz, parents, impl.symbol(), body); @@ -632,15 +582,15 @@ public class ExplicitOuterClassesPhase extends Phase { Debug.show(clasz, context.clasz); Tree tree = context.method == null || context.method.isConstructor() ? gen.Ident(pos, context.context.vlink) - : gen.Select(gen.This(pos, context.clasz), context.context.context.vfield); + : gen.Select(gen.This(pos, context.clasz), context.getVField()); Context context = this.context; while (true) { context = context.outer; assert context != null: Debug.show(clasz, this.context.clasz); if (context.clasz == clasz) return tree; - Symbol access = getAccessSymbol(context.context.context.vfield, null); - assert access != context.context.context.vfield: Debug.show(access) + " - " + Debug.show(this.context.clasz); + Symbol access = getAccessSymbol(context.getVField(), null); + assert access != context.getVField(): Debug.show(access) + " - " + Debug.show(this.context.clasz); tree = gen.Apply(gen.Select(tree, access)); } } @@ -675,8 +625,12 @@ public class ExplicitOuterClassesPhase extends Phase { /** The super access methods (maps members to accessors) */ public final Map/*<Symbol,Symbol>*/ supers; + // !!! public final TypeContext context; + /** The outer value field (null if not yet created) */ + private Symbol vfield; + /** !!! The current method */ public Symbol method; @@ -695,6 +649,21 @@ public class ExplicitOuterClassesPhase extends Phase { return new Context(outer, constructor, selfs, supers); } + /** + * Returns the outer value field. The field is created on the + * fly if it does not yet exist. + */ + private Symbol getVField() { + if (vfield == null) { + int flags = + Modifiers.SYNTHETIC | Modifiers.PRIVATE | Modifiers.STABLE; + vfield = clasz.newField(clasz.pos, flags, Names.OUTER(clasz)); + vfield.setInfo(outer.clasz.thisType()); + clasz.members().enterNoHide(vfield); + } + return vfield; + } + } //######################################################################## |