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

Unified Diff: pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart

Issue 1305663002: [dart2js] fix inference of ??= and []??= (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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 | « no previous file | tests/compiler/dart2js_extra/if_null2_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index d40a34919a4268ee51a59272ed6bd19c1672ca2e..5e6d0ec57be81659a6dfe08c8ab88d39dfcb1d83 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -822,8 +822,6 @@ class SimpleTypeInferrerVisitor<T>
elements.getGetterSelectorInComplexSendSet(node);
TypeMask getterMask =
elements.getGetterTypeMaskInComplexSendSet(node);
- Selector operatorSelector =
- elements.getOperatorSelectorInComplexSendSet(node);
TypeMask operatorMask =
elements.getOperatorTypeMaskInComplexSendSet(node);
Selector setterSelector = elements.getSelector(node);
@@ -882,53 +880,53 @@ class SimpleTypeInferrerVisitor<T>
node, element, setterSelector, setterMask, receiverType, rhsType,
node.arguments.head);
} else {
- // [: foo++ :] or [: foo += 1 :].
- ArgumentsTypes operatorArguments = new ArgumentsTypes<T>([rhsType], null);
+ // [foo ??= bar], [: foo++ :] or [: foo += 1 :].
T getterType;
T newType;
- if (Elements.isErroneous(element)) {
- getterType = types.dynamicType;
- newType = types.dynamicType;
- } else if (Elements.isStaticOrTopLevelField(element)) {
+
+ if (Elements.isErroneous(element)) return types.dynamicType;
+
+ if (Elements.isStaticOrTopLevelField(element)) {
Element getterElement = elements[node.selector];
getterType = handleStaticSend(
node, getterSelector, getterMask, getterElement, null);
- newType = handleDynamicSend(
- node, operatorSelector, operatorMask,
- getterType, operatorArguments);
- handleStaticSend(
- node, setterSelector, setterMask, element,
- new ArgumentsTypes<T>([newType], null));
} else if (Elements.isUnresolved(element)
Siggi Cherem (dart-lang) 2015/08/20 01:39:47 BTW - this looks like a bigger change than it is -
|| element.isSetter
|| element.isField) {
getterType = handleDynamicSend(
node, getterSelector, getterMask, receiverType, null);
- newType = handleDynamicSend(
- node, operatorSelector, operatorMask,
- getterType, operatorArguments);
- handleDynamicSend(node, setterSelector, setterMask, receiverType,
- new ArgumentsTypes<T>([newType], null));
} else if (element.isLocal) {
LocalElement local = element;
getterType = locals.use(local);
- newType = handleDynamicSend(
- node, operatorSelector, operatorMask,
- getterType, operatorArguments);
- locals.update(element, newType, node);
} else {
// Bogus SendSet, for example [: myMethod += 42 :].
getterType = types.dynamicType;
+ }
+
+ if (op == '??=') {
+ newType = types.allocateDiamondPhi(getterType, rhsType);
+ } else {
+ Selector operatorSelector =
+ elements.getOperatorSelectorInComplexSendSet(node);
newType = handleDynamicSend(
node, operatorSelector, operatorMask,
- getterType, operatorArguments);
+ getterType, new ArgumentsTypes<T>([rhsType], null));
}
- if (node.isPostfix) {
- return getterType;
- } else {
- return newType;
+ if (Elements.isStaticOrTopLevelField(element)) {
+ handleStaticSend(
+ node, setterSelector, setterMask, element,
+ new ArgumentsTypes<T>([newType], null));
+ } else if (Elements.isUnresolved(element)
+ || element.isSetter
+ || element.isField) {
+ handleDynamicSend(node, setterSelector, setterMask, receiverType,
+ new ArgumentsTypes<T>([newType], null));
+ } else if (element.isLocal) {
+ locals.update(element, newType, node);
}
+
+ return node.isPostfix ? getterType : newType;
}
}
@@ -955,12 +953,18 @@ class SimpleTypeInferrerVisitor<T>
getterMask,
receiverType,
new ArgumentsTypes<T>([indexType], null));
- T returnType = handleDynamicSend(
- node,
- operatorSelector,
- operatorMask,
- getterType,
- new ArgumentsTypes<T>([rhsType], null));
+
+ T returnType;
+ if (node.isIfNullAssignment) {
+ returnType = types.allocateDiamondPhi(getterType, rhsType);
+ } else {
+ returnType = handleDynamicSend(
+ node,
+ operatorSelector,
+ operatorMask,
+ getterType,
+ new ArgumentsTypes<T>([rhsType], null));
+ }
handleDynamicSend(
node,
setterSelector,
« no previous file with comments | « no previous file | tests/compiler/dart2js_extra/if_null2_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698