Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: compiler/java/com/google/dart/compiler/type/Types.java

Issue 9186017: Fix crash in dartc when given cyclic type variable bounds. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Went back to prior verion of tests. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: compiler/java/com/google/dart/compiler/type/Types.java
diff --git a/compiler/java/com/google/dart/compiler/type/Types.java b/compiler/java/com/google/dart/compiler/type/Types.java
index 1655b682dd477faa13aa0c93bcd9de9c2b55546f..acc340b3e8e658628e3093e6ddec291e4bc2714b 100644
--- a/compiler/java/com/google/dart/compiler/type/Types.java
+++ b/compiler/java/com/google/dart/compiler/type/Types.java
@@ -19,11 +19,13 @@ import com.google.dart.compiler.resolver.VariableElement;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
/**
* Utility class for types.
@@ -257,6 +259,10 @@ public class Types {
*/
@VisibleForTesting
public InterfaceType asInstanceOf(Type t, ClassElement element) {
+ return checkedAsInstanceOf(t, element, new HashSet<TypeVariable>());
+ }
+
+ private InterfaceType checkedAsInstanceOf(Type t, ClassElement element, Set<TypeVariable> variablesReferenced) {
switch (TypeKind.of(t)) {
case FUNCTION_ALIAS:
case INTERFACE: {
@@ -267,13 +273,15 @@ public class Types {
ClassElement tElement = ti.getElement();
InterfaceType supertype = tElement.getSupertype();
if (supertype != null) {
- InterfaceType result = asInstanceOf(asSupertype(ti, supertype), element);
+ InterfaceType result = checkedAsInstanceOf(asSupertype(ti, supertype), element,
+ variablesReferenced);
if (result != null) {
return result;
}
}
for (InterfaceType intrface : tElement.getInterfaces()) {
- InterfaceType result = asInstanceOf(asSupertype(ti, intrface), element);
+ InterfaceType result = checkedAsInstanceOf(asSupertype(ti, intrface), element,
+ variablesReferenced);
if (result != null) {
return result;
}
@@ -287,7 +295,7 @@ public class Types {
// e should be the interface Function in the core library. See the
// documentation comment on FunctionType.
InterfaceType ti = (InterfaceType) e.getType();
- return asInstanceOf(ti, element);
+ return checkedAsInstanceOf(ti, element, variablesReferenced);
default:
return null;
}
@@ -295,7 +303,11 @@ public class Types {
case VARIABLE: {
TypeVariable v = (TypeVariable) t;
Type bound = v.getTypeVariableElement().getBound();
- return asInstanceOf(bound, element);
+ if (variablesReferenced.contains(v)) {
+ return typeProvider.getObjectType();
mmendez 2012/01/31 19:30:51 Nit: should this be the bound of the type variable
+ }
+ variablesReferenced.add(v);
+ return checkedAsInstanceOf(bound, element, variablesReferenced);
}
default:
return null;

Powered by Google App Engine
This is Rietveld 408576698