| Index: frog/leg/enqueue.dart
|
| ===================================================================
|
| --- frog/leg/enqueue.dart (revision 5925)
|
| +++ frog/leg/enqueue.dart (working copy)
|
| @@ -1,208 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -class EnqueueTask extends CompilerTask {
|
| - final Map<String, Link<Element>> instanceMembersByName;
|
| - final Set<ClassElement> seenClasses;
|
| -
|
| - String get name() => 'Enqueue';
|
| -
|
| - EnqueueTask(Compiler compiler)
|
| - : instanceMembersByName = new Map<String, Link<Element>>(),
|
| - seenClasses = new Set<ClassElement>(),
|
| - super(compiler);
|
| -
|
| - bool checkNoEnqueuedInvokedInstanceMethods() {
|
| - measure(() {
|
| - // Run through the classes and see if we need to compile methods.
|
| - for (ClassElement classElement in compiler.universe.instantiatedClasses) {
|
| - for (ClassElement currentClass = classElement;
|
| - currentClass !== null;
|
| - currentClass = currentClass.superclass) {
|
| - processInstantiatedClass(currentClass);
|
| - }
|
| - }
|
| - });
|
| - return true;
|
| - }
|
| -
|
| - void processInstantiatedClass(ClassElement cls) {
|
| - cls.members.forEach(processInstantiatedClassMember);
|
| - }
|
| -
|
| - void registerFieldClosureInvocations() {
|
| - measure(() {
|
| - // Make sure that the closure understands a call with the given
|
| - // selector. For a method-invocation of the form o.foo(a: 499), we
|
| - // need to make sure that closures can handle the optional argument if
|
| - // there exists a field or getter 'foo'.
|
| - var names = compiler.universe.instantiatedClassInstanceFields;
|
| - // TODO(ahe): Might be enough to use invokedGetters.
|
| - for (SourceString name in names) {
|
| - Set<Selector> invokedSelectors = compiler.universe.invokedNames[name];
|
| - if (invokedSelectors != null) {
|
| - for (Selector selector in invokedSelectors) {
|
| - compiler.registerDynamicInvocation(Namer.CLOSURE_INVOCATION_NAME,
|
| - selector);
|
| - }
|
| - }
|
| - }
|
| - });
|
| - }
|
| -
|
| - void processInstantiatedClassMember(Element member) {
|
| - if (compiler.universe.generatedCode.containsKey(member)) return;
|
| -
|
| - if (!member.isInstanceMember()) return;
|
| -
|
| - String memberName = member.name.slowToString();
|
| - Link<Element> members = instanceMembersByName.putIfAbsent(
|
| - memberName, () => const EmptyLink<Element>());
|
| - instanceMembersByName[memberName] = members.prepend(member);
|
| -
|
| - if (member.kind === ElementKind.GETTER ||
|
| - member.kind === ElementKind.FIELD) {
|
| - compiler.universe.instantiatedClassInstanceFields.add(member.name);
|
| - }
|
| -
|
| - if (member.kind == ElementKind.FUNCTION) {
|
| - if (member.name == Compiler.NO_SUCH_METHOD) {
|
| - compiler.enableNoSuchMethod(member);
|
| - }
|
| - Set<Selector> selectors = compiler.universe.invokedNames[member.name];
|
| - if (selectors != null) {
|
| - FunctionElement functionMember = member;
|
| - FunctionParameters parameters =
|
| - functionMember.computeParameters(compiler);
|
| - for (Selector selector in selectors) {
|
| - if (selector.applies(parameters)) {
|
| - return compiler.addToWorkList(member);
|
| - }
|
| - }
|
| - }
|
| - // If there is a property access with the same name as a method we
|
| - // need to emit the method.
|
| - if (compiler.universe.invokedGetters.contains(member.name)) {
|
| - // We will emit a closure, so make sure the closure class is
|
| - // generated.
|
| - compiler.closureClass.ensureResolved(compiler);
|
| - compiler.registerInstantiatedClass(compiler.closureClass);
|
| - return compiler.addToWorkList(member);
|
| - }
|
| - } else if (member.kind == ElementKind.GETTER) {
|
| - if (compiler.universe.invokedGetters.contains(member.name)) {
|
| - return compiler.addToWorkList(member);
|
| - }
|
| - // A method invocation like in o.foo(x, y) might actually be an
|
| - // invocation of the getter foo followed by an invocation of the
|
| - // returned closure.
|
| - Set<Selector> invokedSelectors =
|
| - compiler.universe.invokedNames[member.name];
|
| - // We don't know what selectors the returned closure accepts. If
|
| - // the set contains any selector we have to assume that it matches.
|
| - if (invokedSelectors !== null && !invokedSelectors.isEmpty()) {
|
| - return compiler.addToWorkList(member);
|
| - }
|
| - } else if (member.kind === ElementKind.SETTER) {
|
| - if (compiler.universe.invokedSetters.contains(member.name)) {
|
| - return compiler.addToWorkList(member);
|
| - }
|
| - }
|
| - }
|
| -
|
| - void onRegisterInstantiatedClass(ClassElement cls) => measure(() {
|
| - while (cls !== null) {
|
| - if (seenClasses.contains(cls)) return;
|
| - seenClasses.add(cls);
|
| - // TODO(ahe): Don't call resolveType, instead, call this method
|
| - // when resolveType is called.
|
| - compiler.resolveType(cls);
|
| - cls.members.forEach(processInstantiatedClassMember);
|
| - cls = cls.superclass;
|
| - }
|
| - });
|
| -
|
| - void registerInvocation(SourceString methodName, Selector selector) {
|
| - measure(() {
|
| - Map<SourceString, Set<Selector>> invokedNames =
|
| - compiler.universe.invokedNames;
|
| - Set<Selector> selectors =
|
| - invokedNames.putIfAbsent(methodName, () => new Set<Selector>());
|
| - if (!selectors.contains(selector)) {
|
| - selectors.add(selector);
|
| - handleUnseenInvocation(methodName, selector);
|
| - }
|
| - });
|
| - }
|
| -
|
| - void registerGetter(SourceString methodName) {
|
| - measure(() {
|
| - if (!compiler.universe.invokedGetters.contains(methodName)) {
|
| - compiler.universe.invokedGetters.add(methodName);
|
| - handleUnseenGetter(methodName);
|
| - }
|
| - });
|
| - }
|
| -
|
| - void registerSetter(SourceString methodName) {
|
| - measure(() {
|
| - if (!compiler.universe.invokedSetters.contains(methodName)) {
|
| - compiler.universe.invokedSetters.add(methodName);
|
| - handleUnseenSetter(methodName);
|
| - }
|
| - });
|
| - }
|
| -
|
| - processInstanceMembers(SourceString n, bool f(Element e)) {
|
| - String memberName = n.slowToString();
|
| - Link<Element> members = instanceMembersByName[memberName];
|
| - if (members !== null) {
|
| - LinkBuilder<Element> remaining = new LinkBuilder<Element>();
|
| - for (; !members.isEmpty(); members = members.tail) {
|
| - if (!f(members.head)) remaining.addLast(members.head);
|
| - }
|
| - instanceMembersByName[memberName] = remaining.toLink();
|
| - }
|
| - }
|
| -
|
| - void handleUnseenInvocation(SourceString methodName, Selector selector) {
|
| - processInstanceMembers(methodName, (Element member) {
|
| - if (member.isGetter()) {
|
| - compiler.addToWorkList(member);
|
| - return true;
|
| - } else if (member.isFunction()) {
|
| - FunctionElement functionMember = member;
|
| - FunctionParameters parameters =
|
| - functionMember.computeParameters(compiler);
|
| - if (selector.applies(parameters)) {
|
| - compiler.addToWorkList(member);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| - });
|
| - }
|
| -
|
| - void handleUnseenGetter(SourceString methodName) {
|
| - processInstanceMembers(methodName, (Element member) {
|
| - if (member.isGetter() || member.isFunction()) {
|
| - compiler.addToWorkList(member);
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| - });
|
| - }
|
| -
|
| - void handleUnseenSetter(SourceString methodName) {
|
| - processInstanceMembers(methodName, (Element member) {
|
| - if (member.isSetter()) {
|
| - compiler.addToWorkList(member);
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| - });
|
| - }
|
| -}
|
|
|