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

Unified Diff: pkg/compiler/lib/src/cps_ir/type_propagation.dart

Issue 1214643003: dart2js cps: Set receiver type in type propagation. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Remove JavaScriptBackend + update status Created 5 years, 6 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
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/codegen.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/cps_ir/type_propagation.dart
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index a8a7ee2e6ed8a1411c9d120765fa2318db6d07b0..afb201fe7036f2ec18ef7144ed2b896f3e46112d 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -53,6 +53,11 @@ class TypeMaskSystem {
return mask.locateSingleElement(selector, mask, classWorld.compiler);
}
+ TypeMask getReceiverType(MethodElement method) {
+ assert(method.isInstanceMember);
+ return nonNullSubclass(method.enclosingClass);
+ }
+
TypeMask getParameterType(ParameterElement parameter) {
return inferrer.getGuaranteedTypeOfElement(parameter);
}
@@ -82,7 +87,12 @@ class TypeMaskSystem {
// closure conversion, so just treat those as a subtypes of Function.
// TODO(asgerf): Maybe closure conversion should create a new ClassWorld?
if (element.isClosure) return functionType;
- return new TypeMask.nonNullExact(element, classWorld);
+ return new TypeMask.nonNullExact(element.declaration, classWorld);
+ }
+
+ TypeMask nonNullSubclass(ClassElement element) {
+ if (element.isClosure) return functionType;
+ return new TypeMask.nonNullSubclass(element.declaration, classWorld);
}
bool isDefinitelyBool(TypeMask t, {bool allowNull: false}) {
@@ -1045,8 +1055,8 @@ class TypePropagationVisitor implements Visitor {
void visitFunctionDefinition(FunctionDefinition node) {
if (node.thisParameter != null) {
- // TODO(asgerf): Use a more precise type for 'this'.
- setValue(node.thisParameter, nonConstant(typeSystem.nonNullType));
+ setValue(node.thisParameter,
+ nonConstant(typeSystem.getReceiverType(node.element)));
}
node.parameters.forEach(visit);
setReachable(node.body);
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698