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

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/builder.dart

Issue 12210142: Implement is-checks against type variables. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Do not emit Object.isObject. 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/ssa/builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index f0f844a85e402be7e059f65aa7a0ee8f865a79cd..b630968073d3ec1590576ecd222e7b61149b7537 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -2582,14 +2582,10 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
// TODO(karlklose): change construction of the representations to be GVN'able
// (dartbug.com/7182).
List<HInstruction> buildTypeArgumentRepresentations(DartType type) {
- HInstruction createForeignArray(String code, inputs) {
- return createForeign(code, HType.READABLE_ARRAY, inputs);
- }
-
// Compute the representation of the type arguments, including access
// to the runtime type information for type variables as instructions.
HInstruction representations;
- if (type.element.isTypeVariable()) {
+ if (type.kind == TypeKind.TYPE_VARIABLE) {
return <HInstruction>[addTypeVariableReference(type)];
} else {
assert(type.element.isClass());
@@ -2601,7 +2597,8 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
HInstruction runtimeType = addTypeVariableReference(variable);
inputs.add(runtimeType);
});
- HInstruction representation = createForeignArray(template, inputs);
+ HInstruction representation =
+ createForeign(template, HType.READABLE_ARRAY, inputs);
add(representation);
arguments.add(representation);
}
@@ -2633,6 +2630,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
isNot = true;
}
DartType type = elements.getType(typeAnnotation);
+ compiler.enqueuer.codegen.registerIsCheck(type);
ngeoffray 2013/02/19 09:00:41 Do you need this? Won't the static helper enqueue
if (type.isMalformed) {
String reasons = Types.fetchReasonsFromMalformedType(type);
if (compiler.enableTypeAssertions) {
@@ -2642,16 +2640,23 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
}
return;
}
- if (type.element.isTypeVariable()) {
- // TODO(karlklose): remove this check when the backend can deal with
- // checks of the form [:o is T:] where [:T:] is a type variable.
- stack.add(graph.addConstantBool(true, constantSystem));
- return;
- }
HInstruction instruction;
- if (type.element.isTypeVariable() ||
- RuntimeTypeInformation.hasTypeArguments(type)) {
+ if (type.kind == TypeKind.TYPE_VARIABLE) {
+ List<HInstruction> representations =
+ buildTypeArgumentRepresentations(type);
+ assert(representations.length == 1);
+ HInstruction runtimeType = addTypeVariableReference(type);
+ Element helper =
+ compiler.findHelper(const SourceString('objectIsSubtype'));
+ HInstruction helperCall = new HStatic(helper);
+ add(helperCall);
+ List<HInstruction> inputs = <HInstruction>[helperCall, expression,
+ runtimeType];
+ instruction = new HInvokeStatic(inputs, HType.BOOLEAN);
+ add(instruction);
+
+ } else if (RuntimeTypeInformation.hasTypeArguments(type)) {
void argumentsCheck() {
HInstruction typeInfo = getRuntimeTypeInfo(expression);
@@ -2680,7 +2685,8 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
void classCheck() { push(new HIs(type, <HInstruction>[expression])); }
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, node);
- branchBuilder.handleLogicalAndOr(classCheck, argumentsCheck, isAnd: true);
+ branchBuilder.handleLogicalAndOr(classCheck, argumentsCheck,
+ isAnd: true);
instruction = pop();
} else {
instruction = new HIs(type, <HInstruction>[expression]);

Powered by Google App Engine
This is Rietveld 408576698