| 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 40f80e43295a88dcdb94edc279c4f7ff9ff01718..0932afc8b2f22397a1c6bada782e55ca589e733d 100644
|
| --- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| @@ -123,7 +123,7 @@ class InferrerEngine {
|
| * called with [selector].
|
| */
|
| void updateSideEffects(
|
| - SideEffects sideEffects, Selector selector, Element callee) {
|
| + SideEffects sideEffects, Selector selector, MemberElement callee) {
|
| if (callee.isField) {
|
| if (callee.isInstanceMember) {
|
| if (selector.isSetter) {
|
| @@ -148,8 +148,8 @@ class InferrerEngine {
|
| sideEffects.setAllSideEffects();
|
| sideEffects.setDependsOnSomething();
|
| } else {
|
| - sideEffects.add(
|
| - closedWorldRefiner.getCurrentlyKnownSideEffects(callee.declaration));
|
| + MethodElement method = callee.declaration;
|
| + sideEffects.add(closedWorldRefiner.getCurrentlyKnownSideEffects(method));
|
| }
|
| }
|
|
|
| @@ -223,11 +223,6 @@ class InferrerEngine {
|
| }
|
| }
|
|
|
| - bool isNativeMember(Element element) {
|
| - return element is MemberElement &&
|
| - closedWorld.nativeData.isNativeMember(element);
|
| - }
|
| -
|
| bool checkIfExposesThis(ConstructorElement element) {
|
| element = element.implementation;
|
| return generativeConstructorsExposingThis.contains(element);
|
| @@ -350,15 +345,15 @@ class InferrerEngine {
|
| analyzeMapAndEnqueue(info);
|
| });
|
|
|
| - Set<FunctionElement> bailedOutOn = new Set<FunctionElement>();
|
| + Set<MethodElement> bailedOutOn = new Set<MethodElement>();
|
|
|
| // Trace closures to potentially infer argument types.
|
| types.allocatedClosures.forEach((dynamic info) {
|
| void trace(
|
| - Iterable<FunctionElement> elements, ClosureTracerVisitor tracer) {
|
| + Iterable<MethodElement> elements, ClosureTracerVisitor tracer) {
|
| tracer.run();
|
| if (!tracer.continueAnalyzing) {
|
| - elements.forEach((FunctionElement e) {
|
| + elements.forEach((MethodElement e) {
|
| closedWorldRefiner.registerMightBePassedToApply(e);
|
| if (debug.VERBOSE) print("traced closure $e as ${true} (bail)");
|
| e.functionSignature.forEachParameter((parameter) {
|
| @@ -372,7 +367,7 @@ class InferrerEngine {
|
| }
|
| elements
|
| .where((e) => !bailedOutOn.contains(e))
|
| - .forEach((FunctionElement e) {
|
| + .forEach((MethodElement e) {
|
| e.functionSignature.forEachParameter((parameter) {
|
| var info = types.getInferredTypeOfParameter(parameter);
|
| info.maybeResume();
|
| @@ -390,7 +385,7 @@ class InferrerEngine {
|
| }
|
|
|
| if (info is ClosureTypeInformation) {
|
| - Iterable<FunctionElement> elements = [info.closure];
|
| + Iterable<MethodElement> elements = [info.closure];
|
| trace(elements, new ClosureTracerVisitor(elements, info, this));
|
| } else if (info is CallSiteTypeInformation) {
|
| if (info is StaticCallSiteTypeInformation &&
|
| @@ -400,15 +395,15 @@ class InferrerEngine {
|
| // need to trace the call method here.
|
| assert(info.calledElement.isGenerativeConstructor);
|
| ClassElement cls = info.calledElement.enclosingClass;
|
| - FunctionElement callMethod = cls.lookupMember(Identifiers.call);
|
| + MethodElement callMethod = cls.lookupMember(Identifiers.call);
|
| assert(callMethod != null, failedAt(cls));
|
| - Iterable<FunctionElement> elements = [callMethod];
|
| + Iterable<MethodElement> elements = [callMethod];
|
| trace(elements, new ClosureTracerVisitor(elements, info, this));
|
| } else {
|
| // We only are interested in functions here, as other targets
|
| // of this closure call are not a root to trace but an intermediate
|
| // for some other function.
|
| - Iterable<FunctionElement> elements = new List<FunctionElement>.from(
|
| + Iterable<MethodElement> elements = new List<MethodElement>.from(
|
| info.callees.where((e) => e.isFunction));
|
| trace(elements, new ClosureTracerVisitor(elements, info, this));
|
| }
|
| @@ -525,7 +520,7 @@ class InferrerEngine {
|
| if (value.isFunction) {
|
| FunctionConstantValue functionConstant = value;
|
| MethodElement function = functionConstant.element;
|
| - type = types.allocateClosureForMethod(node, function);
|
| + type = types.allocateClosure(node, function);
|
| } else {
|
| // Although we might find a better type, we have to keep
|
| // the old type around to ensure that we get a complete view
|
| @@ -580,8 +575,8 @@ class InferrerEngine {
|
| types.allocatedCalls.forEach((dynamic info) {
|
| if (!info.inLoop) return;
|
| if (info is StaticCallSiteTypeInformation) {
|
| - closedWorldRefiner
|
| - .addFunctionCalledInLoop(info.calledElement.declaration);
|
| + MemberElement member = info.calledElement.declaration;
|
| + closedWorldRefiner.addFunctionCalledInLoop(member);
|
| } else if (info.mask != null && !info.mask.containsAll(closedWorld)) {
|
| // For instance methods, we only register a selector called in a
|
| // loop if it is a typed selector, to avoid marking too many
|
| @@ -786,14 +781,6 @@ class InferrerEngine {
|
| /**
|
| * Returns the return type of [element].
|
| */
|
| - @deprecated
|
| - TypeInformation returnTypeOfLocalFunction(LocalFunctionElement element) {
|
| - return types.getInferredTypeOfLocalFunction(element);
|
| - }
|
| -
|
| - /**
|
| - * Returns the return type of [element].
|
| - */
|
| TypeInformation returnTypeOfMember(MemberElement element) {
|
| if (element is! MethodElement) return types.dynamicType;
|
| return types.getInferredTypeOfMember(element);
|
| @@ -828,23 +815,6 @@ class InferrerEngine {
|
| /**
|
| * Records that the return type [element] is of type [type].
|
| */
|
| - @deprecated
|
| - void recordReturnTypeOfLocalFunction(
|
| - LocalFunctionElement element, TypeInformation type) {
|
| - TypeInformation info = types.getInferredTypeOfLocalFunction(element);
|
| - if (element.name == '==') {
|
| - // Even if x.== doesn't return a bool, 'x == null' evaluates to 'false'.
|
| - info.addAssignment(types.boolType);
|
| - }
|
| - // TODO(ngeoffray): Clean up. We do these checks because
|
| - // [SimpleTypesInferrer] deals with two different inferrers.
|
| - if (type == null) return;
|
| - if (info.assignments.isEmpty) info.addAssignment(type);
|
| - }
|
| -
|
| - /**
|
| - * Records that the return type [element] is of type [type].
|
| - */
|
| void recordReturnType(MethodElement element, TypeInformation type) {
|
| TypeInformation info = types.getInferredTypeOfMember(element);
|
| if (element.name == '==') {
|
| @@ -864,24 +834,6 @@ class InferrerEngine {
|
| *
|
| * Returns the new type for [analyzedElement].
|
| */
|
| - @deprecated
|
| - TypeInformation addReturnTypeForLocalFunction(LocalFunctionElement element,
|
| - TypeInformation unused, TypeInformation newType) {
|
| - TypeInformation type = types.getInferredTypeOfLocalFunction(element);
|
| - // TODO(ngeoffray): Clean up. We do this check because
|
| - // [SimpleTypesInferrer] deals with two different inferrers.
|
| - if (element.isGenerativeConstructor) return type;
|
| - type.addAssignment(newType);
|
| - return type;
|
| - }
|
| -
|
| - /**
|
| - * Notifies to the inferrer that [analyzedElement] can have return
|
| - * type [newType]. [currentType] is the type the [ElementGraphBuilder]
|
| - * currently found.
|
| - *
|
| - * Returns the new type for [analyzedElement].
|
| - */
|
| TypeInformation addReturnTypeForMethod(
|
| MethodElement element, TypeInformation unused, TypeInformation newType) {
|
| TypeInformation type = types.getInferredTypeOfMember(element);
|
| @@ -902,38 +854,6 @@ class InferrerEngine {
|
| *
|
| * [inLoop] tells whether the call happens in a loop.
|
| */
|
| - @deprecated
|
| - TypeInformation registerCalledLocalFunction(
|
| - Spannable node,
|
| - Selector selector,
|
| - TypeMask mask,
|
| - MemberElement caller,
|
| - LocalFunctionElement callee,
|
| - ArgumentsTypes arguments,
|
| - SideEffects sideEffects,
|
| - bool inLoop) {
|
| - CallSiteTypeInformation info = new LocalFunctionCallSiteTypeInformation(
|
| - types.currentMember,
|
| - node,
|
| - caller,
|
| - callee,
|
| - selector,
|
| - mask,
|
| - arguments,
|
| - inLoop);
|
| - return _registerCalledElement(info, selector, callee, sideEffects);
|
| - }
|
| -
|
| - /**
|
| - * Registers that [caller] calls [callee] at location [node], with
|
| - * [selector], and [arguments]. Note that [selector] is null for
|
| - * forwarding constructors.
|
| - *
|
| - * [sideEffects] will be updated to incorporate [callee]'s side
|
| - * effects.
|
| - *
|
| - * [inLoop] tells whether the call happens in a loop.
|
| - */
|
| TypeInformation registerCalledMember(
|
| Spannable node,
|
| Selector selector,
|
| @@ -952,21 +872,6 @@ class InferrerEngine {
|
| mask,
|
| arguments,
|
| inLoop);
|
| - return _registerCalledElement(info, selector, callee, sideEffects);
|
| - }
|
| -
|
| - /**
|
| - * Registers that [caller] calls [callee] at location [node], with
|
| - * [selector], and [arguments]. Note that [selector] is null for
|
| - * forwarding constructors.
|
| - *
|
| - * [sideEffects] will be updated to incorporate [callee]'s side
|
| - * effects.
|
| - *
|
| - * [inLoop] tells whether the call happens in a loop.
|
| - */
|
| - TypeInformation _registerCalledElement(CallSiteTypeInformation info,
|
| - Selector selector, Element callee, SideEffects sideEffects) {
|
| // If this class has a 'call' method then we have essentially created a
|
| // closure here. Register it as such so that it is traced.
|
| // Note: we exclude factory constructors because they don't always create an
|
| @@ -1161,14 +1066,6 @@ class InferrerEngine {
|
| /**
|
| * Returns the type of [element] when being called with [selector].
|
| */
|
| - TypeInformation typeOfLocalFunctionWithSelector(
|
| - LocalFunctionElement element, Selector selector) {
|
| - return _typeOfElementWithSelector(element, selector);
|
| - }
|
| -
|
| - /**
|
| - * Returns the type of [element] when being called with [selector].
|
| - */
|
| TypeInformation typeOfMemberWithSelector(
|
| MemberElement element, Selector selector) {
|
| return _typeOfElementWithSelector(element, selector);
|
| @@ -1178,16 +1075,12 @@ class InferrerEngine {
|
| * Returns the type of [element] when being called with [selector].
|
| */
|
| TypeInformation _typeOfElementWithSelector(
|
| - Element element, Selector selector) {
|
| + MemberElement element, Selector selector) {
|
| if (element.name == Identifiers.noSuchMethod_ &&
|
| selector.name != element.name) {
|
| // An invocation can resolve to a [noSuchMethod], in which case
|
| // we get the return type of [noSuchMethod].
|
| - if (element.isLocal) {
|
| - return returnTypeOfLocalFunction(element);
|
| - } else {
|
| - return returnTypeOfMember(element);
|
| - }
|
| + return returnTypeOfMember(element);
|
| } else if (selector.isGetter) {
|
| if (element.isFunction) {
|
| // [functionType] is null if the inferrer did not run.
|
| @@ -1200,21 +1093,13 @@ class InferrerEngine {
|
| return types.dynamicType;
|
| } else {
|
| assert(element.isGetter);
|
| - if (element.isLocal) {
|
| - return returnTypeOfLocalFunction(element);
|
| - } else {
|
| - return returnTypeOfMember(element);
|
| - }
|
| + return returnTypeOfMember(element);
|
| }
|
| } else if (element.isGetter || element.isField) {
|
| assert(selector.isCall || selector.isSetter);
|
| return types.dynamicType;
|
| } else {
|
| - if (element.isLocal) {
|
| - return returnTypeOfLocalFunction(element);
|
| - } else {
|
| - return returnTypeOfMember(element);
|
| - }
|
| + return returnTypeOfMember(element);
|
| }
|
| }
|
|
|
|
|