| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js; | 5 part of dart2js; |
| 6 | 6 |
| 7 typedef ItemCompilationContext ItemCompilationContextCreator(); | 7 typedef ItemCompilationContext ItemCompilationContextCreator(); |
| 8 | 8 |
| 9 class EnqueueTask extends CompilerTask { | 9 class EnqueueTask extends CompilerTask { |
| 10 final ResolutionEnqueuer resolution; | 10 final ResolutionEnqueuer resolution; |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 } | 805 } |
| 806 | 806 |
| 807 /// [Enqueuer] which is specific to code generation. | 807 /// [Enqueuer] which is specific to code generation. |
| 808 class CodegenEnqueuer extends Enqueuer { | 808 class CodegenEnqueuer extends Enqueuer { |
| 809 final Queue<CodegenWorkItem> queue; | 809 final Queue<CodegenWorkItem> queue; |
| 810 final Map<Element, js.Expression> generatedCode = | 810 final Map<Element, js.Expression> generatedCode = |
| 811 new Map<Element, js.Expression>(); | 811 new Map<Element, js.Expression>(); |
| 812 | 812 |
| 813 final Set<Element> newlyEnqueuedElements; | 813 final Set<Element> newlyEnqueuedElements; |
| 814 | 814 |
| 815 final Set<Selector> newlySeenSelectors; |
| 816 |
| 815 CodegenEnqueuer(Compiler compiler, | 817 CodegenEnqueuer(Compiler compiler, |
| 816 ItemCompilationContext itemCompilationContextCreator()) | 818 ItemCompilationContext itemCompilationContextCreator()) |
| 817 : queue = new Queue<CodegenWorkItem>(), | 819 : queue = new Queue<CodegenWorkItem>(), |
| 818 newlyEnqueuedElements = compiler.cacheStrategy.newSet(), | 820 newlyEnqueuedElements = compiler.cacheStrategy.newSet(), |
| 821 newlySeenSelectors = compiler.cacheStrategy.newSet(), |
| 819 super('codegen enqueuer', compiler, itemCompilationContextCreator); | 822 super('codegen enqueuer', compiler, itemCompilationContextCreator); |
| 820 | 823 |
| 821 bool isProcessed(Element member) => | 824 bool isProcessed(Element member) => |
| 822 member.isAbstract || generatedCode.containsKey(member); | 825 member.isAbstract || generatedCode.containsKey(member); |
| 823 | 826 |
| 824 /** | 827 /** |
| 825 * Decides whether an element should be included to satisfy requirements | 828 * Decides whether an element should be included to satisfy requirements |
| 826 * of the mirror system. | 829 * of the mirror system. |
| 827 * | 830 * |
| 828 * For code generation, we rely on the precomputed set of elements that takes | 831 * For code generation, we rely on the precomputed set of elements that takes |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 super.forgetElement(element); | 871 super.forgetElement(element); |
| 869 generatedCode.remove(element); | 872 generatedCode.remove(element); |
| 870 if (element is MemberElement) { | 873 if (element is MemberElement) { |
| 871 for (Element closure in element.nestedClosures) { | 874 for (Element closure in element.nestedClosures) { |
| 872 generatedCode.remove(closure); | 875 generatedCode.remove(closure); |
| 873 removeFromSet(instanceMembersByName, closure); | 876 removeFromSet(instanceMembersByName, closure); |
| 874 removeFromSet(instanceFunctionsByName, closure); | 877 removeFromSet(instanceFunctionsByName, closure); |
| 875 } | 878 } |
| 876 } | 879 } |
| 877 } | 880 } |
| 881 |
| 882 void handleUnseenSelector(String methodName, Selector selector) { |
| 883 if (compiler.hasIncrementalSupport) { |
| 884 newlySeenSelectors.add(selector); |
| 885 } |
| 886 super.handleUnseenSelector(methodName, selector); |
| 887 } |
| 878 } | 888 } |
| 879 | 889 |
| 880 /// Parameterizes filtering of which work items are enqueued. | 890 /// Parameterizes filtering of which work items are enqueued. |
| 881 class QueueFilter { | 891 class QueueFilter { |
| 882 bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) { | 892 bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) { |
| 883 enqueuer.task.measure(() { | 893 enqueuer.task.measure(() { |
| 884 // Run through the classes and see if we need to compile methods. | 894 // Run through the classes and see if we need to compile methods. |
| 885 for (ClassElement classElement in | 895 for (ClassElement classElement in |
| 886 enqueuer.universe.directlyInstantiatedClasses) { | 896 enqueuer.universe.directlyInstantiatedClasses) { |
| 887 for (ClassElement currentClass = classElement; | 897 for (ClassElement currentClass = classElement; |
| 888 currentClass != null; | 898 currentClass != null; |
| 889 currentClass = currentClass.superclass) { | 899 currentClass = currentClass.superclass) { |
| 890 enqueuer.processInstantiatedClassMembers(currentClass); | 900 enqueuer.processInstantiatedClassMembers(currentClass); |
| 891 } | 901 } |
| 892 } | 902 } |
| 893 }); | 903 }); |
| 894 return true; | 904 return true; |
| 895 } | 905 } |
| 896 | 906 |
| 897 void processWorkItem(void f(WorkItem work), WorkItem work) { | 907 void processWorkItem(void f(WorkItem work), WorkItem work) { |
| 898 f(work); | 908 f(work); |
| 899 } | 909 } |
| 900 } | 910 } |
| 901 | 911 |
| 902 void removeFromSet(Map<String, Set<Element>> map, Element element) { | 912 void removeFromSet(Map<String, Set<Element>> map, Element element) { |
| 903 Set<Element> set = map[element.name]; | 913 Set<Element> set = map[element.name]; |
| 904 if (set == null) return; | 914 if (set == null) return; |
| 905 set.remove(element); | 915 set.remove(element); |
| 906 } | 916 } |
| OLD | NEW |