diff options
author | Martin Odersky <odersky@gmail.com> | 2004-11-19 12:47:00 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2004-11-19 12:47:00 +0000 |
commit | d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea (patch) | |
tree | 400b779459756769d2c134ec2725a3e658ede8f7 /sources/scalac | |
parent | 172de146a8ae56f45104ba25f82540bd9e2cec0d (diff) | |
download | scala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.tar.gz scala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.tar.bz2 scala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.zip |
*** empty log message ***
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/symtab/Modifiers.java | 3 | ||||
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 7 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 12 | ||||
-rw-r--r-- | sources/scalac/transformer/LambdaLift.java | 4 |
4 files changed, 22 insertions, 4 deletions
diff --git a/sources/scalac/symtab/Modifiers.java b/sources/scalac/symtab/Modifiers.java index 173eda4e61..ab222e723f 100644 --- a/sources/scalac/symtab/Modifiers.java +++ b/sources/scalac/symtab/Modifiers.java @@ -48,6 +48,9 @@ public interface Modifiers { int INCONSTRUCTOR = 0x01000000; // transient flag for Analyzer int PARAMACCESSOR = 0x02000000; // for methods: is an access method for a val parameter // for parameters: is a val parameter + int CLOSURELOCK = PARAMACCESSOR; + // secondary meaning: a lock to test that closures of type + // symbols are non-cyclic. int ACCESSOR = 0x04000000; // function is an access function for a // value or variable diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index d2bbd8f8b7..3390eb7a26 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -1970,7 +1970,12 @@ abstract class TypeSymbol extends Symbol { */ public final Type[] closure() { if (kind == ALIAS) return info().symbol().closure(); - return (Type[])closures.getValue(this); + if ((flags & CLOSURELOCK) != 0 && Global.instance.currentPhase.id <= Global.instance.PHASE.REFCHECK.id()) + throw new Type.Error("illegal cyclic reference involving " + this); + flags |= CLOSURELOCK; + Type[] result = (Type[])closures.getValue(this); + flags &= ~CLOSURELOCK; + return result; } public void reset(Type completer) { diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 3c260d93b7..2b2044a872 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -215,8 +215,14 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { throw new Type.Malformed(pre, sym.nameString()); if (sym.isTypeAlias()) { Symbol[] params = sym.typeParams(); - if (args.length == params.length) - return pre.memberInfo(sym).subst(params, args); + if (args.length == params.length) { + if (sym.isLocked()) throw new Type.Error( + "illegal cyclic reference involving " + sym); + sym.flags |= LOCKED; + Type result = pre.memberInfo(sym).subst(params, args); + sym.flags &= ~LOCKED; + return result; + } assert args.length == 0 || args.length == params.length: Debug.show(pre, sym, args, params); } @@ -2690,7 +2696,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { /** Return the least upper bound of non-empty array of types `tps'. */ public static Type lub0(Type[] tps) { - //System.out.println("lub" + ArrayApply.toString(tps));//DEBUG + //for (int i = 0; i < recCount; i++) System.out.print(" "); System.out.println("lub" + ArrayApply.toString(tps));//debug if (tps.length == 0) return Global.instance.definitions.ALL_TYPE(); diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java index 5cb2d52117..d6247af62b 100644 --- a/sources/scalac/transformer/LambdaLift.java +++ b/sources/scalac/transformer/LambdaLift.java @@ -441,6 +441,10 @@ public class LambdaLift extends OwnerTransformer return tree1; */ + case Return(Block(Tree[] stats, Tree value)): + return transform( + gen.Block(stats, gen.Return(tree.pos, tree.symbol(), value))); + case Return(Tree expr): if (tree.symbol() != currentOwner.enclMethod()) { unit.error(tree.pos, "non-local return not yet implemented"); |