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

Unified Diff: sdk/lib/_internal/compiler/implementation/universe/universe.dart

Issue 12210142: Implement is-checks against type variables. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove some obsolete code. Created 7 years, 10 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: sdk/lib/_internal/compiler/implementation/universe/universe.dart
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 0b78d6337c6c7bee64d0737244b981d6d94decfb..1e33b8e41573e8851b40d52cd33af407b72821fe 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -88,6 +88,42 @@ class Universe {
bool hasFieldSetter(Element member, Compiler compiler) {
return fieldSetters.contains(member);
}
+
+ /**
+ * Compute type arguments of classes that potentially use their type
ngeoffray 2013/02/26 14:11:37 Why potentially? We know they are for the resoluti
karlklose 2013/02/27 10:12:58 I meant it may use it, if the method containing it
+ * variables in is-checks and add the is-checks that they imply.
+ *
+ * This function must be called after all is-checks have been registered.
+ *
+ * TODO(karlklose): move these computations into a function producing an
+ * immutable datastructure.
+ */
+ void addImplicitChecks(Iterable<ClassElement> classesUsingChecks) {
+ if (!classesUsingChecks.isEmpty) {
ngeoffray 2013/02/26 14:11:37 How about: if (classesUsingChecks.isEmpty) return;
karlklose 2013/02/27 10:12:58 Done.
+ // Find all instantiated types that are a subtype of a class that uses
+ // one of its type arguments in an is-check and add the arguments to the
+ // set of is-checks.
+ // TODO(karlklose): replace this with code that uses a subtype lookup
+ // datastructure in the world.
+ for (DartType type in instantiatedTypes) {
+ if (type.kind != TypeKind.INTERFACE) {
+ continue;
+ }
+ InterfaceType classType = type;
+ for (ClassElement cls in classesUsingChecks) {
+ // We need the type as instance of its superclass anyway, so we just
+ // try to compute the substitution; if the result is [:null:], the
+ // classes are not related.
+ InterfaceType instance = classType.asInstanceOf(cls);
+ if (instance == null) continue;
+ Link<DartType> typeArguments = instance.typeArguments;
+ for (DartType argument in typeArguments) {
+ isChecks.add(argument);
+ }
+ }
+ }
+ }
+ }
}
class SelectorKind {

Powered by Google App Engine
This is Rietveld 408576698