| 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 5f6162e3730726c4aaaaa6f0bbd84f34b0e4e967..2192dd86876006ac8d04bf9c3ca67a6f538e5d66 100644
|
| --- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
|
| @@ -114,7 +114,8 @@ abstract class InferrerEngine {
|
| /// mapping in [defaultTypeOfParameter] already contains a type, it must be
|
| /// a [PlaceholderTypeInformation], which will be replaced. All its uses are
|
| /// updated.
|
| - void setDefaultTypeOfParameter(Local parameter, TypeInformation type);
|
| + void setDefaultTypeOfParameter(Local parameter, TypeInformation type,
|
| + {bool isInstanceMember});
|
|
|
| Iterable<MemberEntity> getCallersOf(MemberEntity element);
|
|
|
| @@ -227,11 +228,11 @@ abstract class InferrerEngine {
|
| }
|
|
|
| class InferrerEngineImpl extends InferrerEngine {
|
| - final Map<ParameterElement, TypeInformation> defaultTypeOfParameter =
|
| - new Map<ParameterElement, TypeInformation>();
|
| + final Map<Local, TypeInformation> defaultTypeOfParameter =
|
| + new Map<Local, TypeInformation>();
|
| final WorkQueue workQueue = new WorkQueue();
|
| final FunctionEntity mainElement;
|
| - final Set<MemberElement> analyzedElements = new Set<MemberElement>();
|
| + final Set<MemberEntity> analyzedElements = new Set<MemberEntity>();
|
|
|
| /// The maximum number of times we allow a node in the graph to
|
| /// change types. If a node reaches that limit, we give up
|
| @@ -258,8 +259,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
|
|
| /// Data computed internally within elements, like the type-mask of a send a
|
| /// list allocation, or a for-in loop.
|
| - final Map<MemberElement, GlobalTypeInferenceElementData> _memberData =
|
| - new Map<MemberElement, GlobalTypeInferenceElementData>();
|
| + final Map<MemberEntity, GlobalTypeInferenceElementData> _memberData =
|
| + new Map<MemberEntity, GlobalTypeInferenceElementData>();
|
|
|
| InferrerEngineImpl(this.compiler, ClosedWorld closedWorld,
|
| this.closedWorldRefiner, this.mainElement)
|
| @@ -270,7 +271,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| void forEachElementMatching(
|
| Selector selector, TypeMask mask, bool f(MemberEntity element)) {
|
| Iterable<MemberEntity> elements = closedWorld.locateMembers(selector, mask);
|
| - for (MemberElement e in elements) {
|
| + for (MemberEntity e in elements) {
|
| if (!f(e)) return;
|
| }
|
| }
|
| @@ -288,7 +289,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
| * called with [selector].
|
| */
|
| void updateSideEffects(
|
| - SideEffects sideEffects, Selector selector, MemberElement callee) {
|
| + SideEffects sideEffects, Selector selector, MemberEntity callee) {
|
| + assert(!(callee is MemberElement && !callee.isDeclaration));
|
| if (callee.isField) {
|
| if (callee.isInstanceMember) {
|
| if (selector.isSetter) {
|
| @@ -313,8 +315,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| sideEffects.setAllSideEffects();
|
| sideEffects.setDependsOnSomething();
|
| } else {
|
| - MethodElement method = callee.declaration;
|
| - sideEffects.add(closedWorldRefiner.getCurrentlyKnownSideEffects(method));
|
| + sideEffects.add(closedWorldRefiner.getCurrentlyKnownSideEffects(callee));
|
| }
|
| }
|
|
|
| @@ -535,7 +536,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
|
|
| if (info is ClosureTypeInformation) {
|
| - Iterable<MethodElement> elements = [info.closure];
|
| + Iterable<FunctionEntity> elements = [info.closure];
|
| trace(elements, new ClosureTracerVisitor(elements, info, this));
|
| } else if (info is CallSiteTypeInformation) {
|
| if (info is StaticCallSiteTypeInformation &&
|
| @@ -611,8 +612,8 @@ class InferrerEngineImpl extends InferrerEngine {
|
| print('${info.getInferredSignature(types)} for '
|
| '${info.debugName}');
|
| } else if (info is DynamicCallSiteTypeInformation) {
|
| - for (MemberElement target in info.targets) {
|
| - if (target is MethodElement) {
|
| + for (MemberEntity target in info.targets) {
|
| + if (target is FunctionEntity) {
|
| print(
|
| '${types.getInferredSignatureOfMethod(target)} for ${target}');
|
| } else {
|
| @@ -628,7 +629,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| print('${info.type} for some unknown kind of closure');
|
| }
|
| });
|
| - analyzedElements.forEach((MemberElement elem) {
|
| + analyzedElements.forEach((MemberEntity elem) {
|
| TypeInformation type = types.getInferredTypeOfMember(elem);
|
| print('${elem} :: ${type} from ${type.assignments} ');
|
| });
|
| @@ -736,7 +737,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| // loop if it is a typed selector, to avoid marking too many
|
| // methods as being called from within a loop. This cuts down
|
| // on the code bloat.
|
| - info.targets.forEach((MemberElement element) {
|
| + info.targets.forEach((MemberEntity element) {
|
| closedWorldRefiner.addFunctionCalledInLoop(element);
|
| });
|
| }
|
| @@ -855,15 +856,15 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
| }
|
|
|
| - void setDefaultTypeOfParameter(
|
| - covariant ParameterElement parameter, TypeInformation type) {
|
| - assert(parameter.functionDeclaration.isImplementation);
|
| + void setDefaultTypeOfParameter(Local parameter, TypeInformation type,
|
| + {bool isInstanceMember}) {
|
| + assert(!(parameter is ParameterElement && !parameter.isImplementation));
|
| TypeInformation existing = defaultTypeOfParameter[parameter];
|
| defaultTypeOfParameter[parameter] = type;
|
| TypeInformation info = types.getInferredTypeOfParameter(parameter);
|
| if (existing != null && existing is PlaceholderTypeInformation) {
|
| // Replace references to [existing] to use [type] instead.
|
| - if (parameter.functionDeclaration.isInstanceMember) {
|
| + if (isInstanceMember) {
|
| ParameterAssignments assignments = info.assignments;
|
| assignments.replace(existing, type);
|
| } else {
|
| @@ -882,12 +883,14 @@ class InferrerEngineImpl extends InferrerEngine {
|
| }
|
|
|
| TypeInformation getDefaultTypeOfParameter(Local parameter) {
|
| + assert(!(parameter is ParameterElement && !parameter.isImplementation));
|
| return defaultTypeOfParameter.putIfAbsent(parameter, () {
|
| return new PlaceholderTypeInformation(types.currentMember);
|
| });
|
| }
|
|
|
| bool hasAlreadyComputedTypeOfParameterDefault(Local parameter) {
|
| + assert(!(parameter is ParameterElement && !parameter.isImplementation));
|
| TypeInformation seen = defaultTypeOfParameter[parameter];
|
| return (seen != null && seen is! PlaceholderTypeInformation);
|
| }
|
| @@ -922,12 +925,14 @@ class InferrerEngineImpl extends InferrerEngine {
|
| if (info.assignments.isEmpty) info.addAssignment(type);
|
| }
|
|
|
| - TypeInformation addReturnTypeForMethod(covariant MethodElement element,
|
| - TypeInformation unused, TypeInformation newType) {
|
| + TypeInformation addReturnTypeForMethod(
|
| + FunctionEntity element, TypeInformation unused, TypeInformation newType) {
|
| TypeInformation type = types.getInferredTypeOfMember(element);
|
| // TODO(ngeoffray): Clean up. We do this check because
|
| // [SimpleTypesInferrer] deals with two different inferrers.
|
| - if (element.isGenerativeConstructor) return type;
|
| + if (element is ConstructorEntity && element.isGenerativeConstructor) {
|
| + return type;
|
| + }
|
| type.addAssignment(newType);
|
| return type;
|
| }
|
| @@ -937,7 +942,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| Selector selector,
|
| TypeMask mask,
|
| MemberEntity caller,
|
| - covariant MemberElement callee,
|
| + MemberEntity callee,
|
| ArgumentsTypes arguments,
|
| SideEffects sideEffects,
|
| bool inLoop) {
|
| @@ -955,7 +960,10 @@ class InferrerEngineImpl extends InferrerEngine {
|
| // Note: we exclude factory constructors because they don't always create an
|
| // instance of the type. They are static methods that delegate to some other
|
| // generative constructor to do the actual creation of the object.
|
| - if (selector != null && selector.isCall && callee.isGenerativeConstructor) {
|
| + if (selector != null &&
|
| + selector.isCall &&
|
| + callee is ConstructorEntity &&
|
| + callee.isGenerativeConstructor) {
|
| ClassElement cls = callee.enclosingClass;
|
| if (cls.callType != null) {
|
| types.allocatedClosures.add(info);
|
| @@ -982,8 +990,7 @@ class InferrerEngineImpl extends InferrerEngine {
|
| arguments, sideEffects, inLoop);
|
| }
|
|
|
| - closedWorld.locateMembers(selector, mask).forEach((_callee) {
|
| - MemberElement callee = _callee;
|
| + closedWorld.locateMembers(selector, mask).forEach((callee) {
|
| updateSideEffects(sideEffects, selector, callee);
|
| });
|
|
|
|
|