Chromium Code Reviews| Index: pkg/compiler/lib/src/inferrer/inferrer_engine.dart |
| diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart |
| index 23947f26b9d196a15728694f2ed1f154db0a1fdf..3ee5dd6c4c2791be361679a2e534de63ae6046a2 100644 |
| --- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart |
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart |
| @@ -183,6 +183,7 @@ abstract class InferrerEngine { |
| /// |
| /// [inLoop] tells whether the call happens in a loop. |
| TypeInformation registerCalledSelector( |
| + CallType callType, |
| ast.Node node, |
| Selector selector, |
| TypeMask mask, |
| @@ -200,8 +201,8 @@ abstract class InferrerEngine { |
| ArgumentsTypes arguments, Selector selector, TypeMask mask, |
| {bool remove, bool addToQueue: true}); |
| - void updateSelectorInMember( |
| - MemberEntity owner, ast.Node node, Selector selector, TypeMask mask); |
| + void updateSelectorInMember(MemberEntity owner, CallType callType, |
| + ast.Node node, Selector selector, TypeMask mask); |
| /// Returns the return type of [element]. |
| TypeInformation returnTypeOfMember(MemberEntity element); |
| @@ -357,10 +358,38 @@ class InferrerEngineImpl extends InferrerEngine { |
| return returnType; |
| } |
| - void updateSelectorInMember( |
| - MemberEntity owner, ast.Node node, Selector selector, TypeMask mask) { |
| + void updateSelectorInMember(MemberEntity owner, CallType callType, |
| + ast.Node node, Selector selector, TypeMask mask) { |
| GlobalTypeInferenceElementData data = dataOfMember(owner); |
| - if (node.asSendSet() != null) { |
| + switch (callType) { |
| + case CallType.complex: |
| + assert(node.asSendSet() != null); |
| + if (selector.isSetter || selector.isIndexSet) { |
| + data.setTypeMask(node, mask); |
| + } else if (selector.isGetter || selector.isIndex) { |
| + data.setGetterTypeMaskInComplexSendSet(node, mask); |
| + } else { |
| + assert(selector.isOperator); |
| + data.setOperatorTypeMaskInComplexSendSet(node, mask); |
| + } |
| + break; |
| + case CallType.access: |
| + assert(node.asSend() != null); |
| + data.setTypeMask(node, mask); |
| + break; |
| + case CallType.forIn: |
| + assert(node.asForIn() != null); |
| + if (selector == Selectors.iterator) { |
| + data.setIteratorTypeMask(node, mask); |
| + } else if (selector == Selectors.current) { |
| + data.setCurrentTypeMask(node, mask); |
| + } else { |
| + assert(selector == Selectors.moveNext); |
| + data.setMoveNextTypeMask(node, mask); |
| + } |
| + break; |
| + } |
| + /*if (node.asSendSet() != null) { |
|
Siggi Cherem (dart-lang)
2017/07/31 19:30:29
delete old code
Johnni Winther
2017/08/01 13:09:20
Done.
|
| if (selector.isSetter || selector.isIndexSet) { |
| data.setTypeMask(node, mask); |
| } else if (selector.isGetter || selector.isIndex) { |
| @@ -381,7 +410,7 @@ class InferrerEngineImpl extends InferrerEngine { |
| assert(selector == Selectors.moveNext); |
| data.setMoveNextTypeMask(node, mask); |
| } |
| - } |
| + }*/ |
| } |
| bool checkIfExposesThis(ConstructorEntity element) { |
| @@ -976,6 +1005,7 @@ class InferrerEngineImpl extends InferrerEngine { |
| } |
| TypeInformation registerCalledSelector( |
| + CallType callType, |
| ast.Node node, |
| Selector selector, |
| TypeMask mask, |
| @@ -996,6 +1026,7 @@ class InferrerEngineImpl extends InferrerEngine { |
| CallSiteTypeInformation info = new DynamicCallSiteTypeInformation( |
| types.currentMember, |
| + callType, |
| node, |
| caller, |
| selector, |