summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-11-19 12:47:00 +0000
committerMartin Odersky <odersky@gmail.com>2004-11-19 12:47:00 +0000
commitd2b9c55e12acbab3694ae9c8fcb0d69d46c643ea (patch)
tree400b779459756769d2c134ec2725a3e658ede8f7 /sources/scalac/symtab
parent172de146a8ae56f45104ba25f82540bd9e2cec0d (diff)
downloadscala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.tar.gz
scala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.tar.bz2
scala-d2b9c55e12acbab3694ae9c8fcb0d69d46c643ea.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/symtab')
-rw-r--r--sources/scalac/symtab/Modifiers.java3
-rw-r--r--sources/scalac/symtab/Symbol.java7
-rw-r--r--sources/scalac/symtab/Type.java12
3 files changed, 18 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();