Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(299)

Side by Side Diff: pkg/compiler/lib/src/closure.dart

Issue 2924663002: Revert "Make ClosureTask only accept Element-level APIs instead of resolvedAst." (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/builder.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 library closureToClassMapper; 5 library closureToClassMapper;
6 6
7 import 'common/names.dart' show Identifiers; 7 import 'common/names.dart' show Identifiers;
8 import 'common/resolution.dart' show ParsingContext, Resolution; 8 import 'common/resolution.dart' show ParsingContext, Resolution;
9 import 'common/tasks.dart' show CompilerTask; 9 import 'common/tasks.dart' show CompilerTask;
10 import 'common.dart'; 10 import 'common.dart';
(...skipping 24 matching lines...) Expand all
35 Compiler compiler; 35 Compiler compiler;
36 ClosureTask(Compiler compiler) 36 ClosureTask(Compiler compiler)
37 : compiler = compiler, 37 : compiler = compiler,
38 super(compiler.measurer); 38 super(compiler.measurer);
39 39
40 String get name => "Closure Simplifier"; 40 String get name => "Closure Simplifier";
41 41
42 DiagnosticReporter get reporter => compiler.reporter; 42 DiagnosticReporter get reporter => compiler.reporter;
43 43
44 ClosureClassMap getMemberMap(MemberElement member) { 44 ClosureClassMap getMemberMap(MemberElement member) {
45 return getClosureToClassMapping(member); 45 return getClosureToClassMapping(member.resolvedAst);
46 } 46 }
47 47
48 ClosureClassMap getLocalFunctionMap(LocalFunctionElement localFunction) { 48 ClosureClassMap getLocalFunctionMap(LocalFunctionElement localFunction) {
49 return getClosureToClassMapping(localFunction); 49 return getClosureToClassMapping(localFunction.resolvedAst);
50 } 50 }
51 51
52 /// Returns the [ClosureClassMap] computed for [resolvedAst]. 52 /// Returns the [ClosureClassMap] computed for [resolvedAst].
53 ClosureClassMap getClosureToClassMapping(Element element) { 53 ClosureClassMap getClosureToClassMapping(ResolvedAst resolvedAst) {
54 return measure(() { 54 return measure(() {
55 Element element = resolvedAst.element;
55 if (element.isGenerativeConstructorBody) { 56 if (element.isGenerativeConstructorBody) {
56 ConstructorBodyElement constructorBody = element; 57 ConstructorBodyElement constructorBody = element;
57 element = constructorBody.constructor; 58 element = constructorBody.constructor;
58 } 59 }
59 ClosureClassMap closureClassMap = _closureMappingCache[element]; 60 ClosureClassMap closureClassMap = _closureMappingCache[element];
60 assert(closureClassMap != null, 61 assert(
61 failedAt(element, "No ClosureClassMap computed for ${element}.")); 62 closureClassMap != null,
63 failedAt(resolvedAst.element,
64 "No ClosureClassMap computed for ${element}."));
62 return closureClassMap; 65 return closureClassMap;
63 }); 66 });
64 } 67 }
65 68
66 /// Create [ClosureClassMap]s for all live members. 69 /// Create [ClosureClassMap]s for all live members.
67 void createClosureClasses(ClosedWorldRefiner closedWorldRefiner) { 70 void createClosureClasses(ClosedWorldRefiner closedWorldRefiner) {
68 compiler.enqueuer.resolution.processedEntities 71 compiler.enqueuer.resolution.processedEntities
69 .forEach((MemberElement element) { 72 .forEach((MemberElement element) {
70 ResolvedAst resolvedAst = element.resolvedAst; 73 ResolvedAst resolvedAst = element.resolvedAst;
71 if (element.isAbstract) return; 74 if (element.isAbstract) return;
72 if (element.isField && 75 if (element.isField &&
73 !element.isInstanceMember && 76 !element.isInstanceMember &&
74 resolvedAst.body == null) { 77 resolvedAst.body == null) {
75 // Skip top-level/static fields without an initializer. 78 // Skip top-level/static fields without an initializer.
76 return; 79 return;
77 } 80 }
78 computeClosureToClassMapping(element, closedWorldRefiner); 81 computeClosureToClassMapping(resolvedAst, closedWorldRefiner);
79 }); 82 });
80 } 83 }
81 84
82 ClosureClassMap computeClosureToClassMapping( 85 ClosureClassMap computeClosureToClassMapping(
83 Element element, ClosedWorldRefiner closedWorldRefiner) { 86 ResolvedAst resolvedAst, ClosedWorldRefiner closedWorldRefiner) {
84 return measure(() { 87 return measure(() {
88 Element element = resolvedAst.element;
85 ClosureClassMap cached = _closureMappingCache[element]; 89 ClosureClassMap cached = _closureMappingCache[element];
86 if (cached != null) return cached; 90 if (cached != null) return cached;
87 if (element.resolvedAst.kind != ResolvedAstKind.PARSED) { 91 if (resolvedAst.kind != ResolvedAstKind.PARSED) {
88 return _closureMappingCache[element] = 92 return _closureMappingCache[element] =
89 new ClosureClassMap(null, null, null, new ThisLocal(element)); 93 new ClosureClassMap(null, null, null, new ThisLocal(element));
90 } 94 }
91 return reporter.withCurrentElement(element.implementation, () { 95 return reporter.withCurrentElement(element.implementation, () {
92 Node node = element.resolvedAst.node; 96 Node node = resolvedAst.node;
93 TreeElements elements = element.resolvedAst.elements; 97 TreeElements elements = resolvedAst.elements;
94 98
95 ClosureTranslator translator = new ClosureTranslator( 99 ClosureTranslator translator = new ClosureTranslator(
96 compiler, closedWorldRefiner, elements, _closureMappingCache); 100 compiler, closedWorldRefiner, elements, _closureMappingCache);
97 101
98 // The translator will store the computed closure-mappings inside the 102 // The translator will store the computed closure-mappings inside the
99 // cache. One for given node and one for each nested closure. 103 // cache. One for given node and one for each nested closure.
100 if (node is FunctionExpression) { 104 if (node is FunctionExpression) {
101 translator.translateFunction(element, node); 105 translator.translateFunction(element, node);
102 } else if (element.isSynthesized) { 106 } else if (element.isSynthesized) {
103 reporter.internalError( 107 reporter.internalError(
104 element, "Unexpected synthesized element: $element"); 108 element, "Unexpected synthesized element: $element");
105 _closureMappingCache[element] = 109 _closureMappingCache[element] =
106 new ClosureClassMap(null, null, null, new ThisLocal(element)); 110 new ClosureClassMap(null, null, null, new ThisLocal(element));
107 } else { 111 } else {
108 assert(element.isField, 112 assert(element.isField,
109 failedAt(element, "Expected $element to be a field.")); 113 failedAt(element, "Expected $element to be a field."));
110 Node initializer = element.resolvedAst.body; 114 Node initializer = resolvedAst.body;
111 if (initializer != null) { 115 if (initializer != null) {
112 // The lazy initializer of a static. 116 // The lazy initializer of a static.
113 translator.translateLazyInitializer(element, node, initializer); 117 translator.translateLazyInitializer(element, node, initializer);
114 } else { 118 } else {
115 assert( 119 assert(
116 element.isInstanceMember, 120 element.isInstanceMember,
117 failedAt( 121 failedAt(
118 element, 122 element,
119 "Expected $element (${element.runtimeType}) " 123 "Expected $element (${element.runtimeType}) "
120 "to be an instance field.")); 124 "to be an instance field."));
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 ThisLocal thisElement = null; 1132 ThisLocal thisElement = null;
1129 if (element.isInstanceMember || element.isGenerativeConstructor) { 1133 if (element.isInstanceMember || element.isGenerativeConstructor) {
1130 thisElement = new ThisLocal(element); 1134 thisElement = new ThisLocal(element);
1131 } 1135 }
1132 closureData = new ClosureClassMap(null, null, null, thisElement); 1136 closureData = new ClosureClassMap(null, null, null, thisElement);
1133 if (element is MethodElement) { 1137 if (element is MethodElement) {
1134 needsRti = compiler.options.enableTypeAssertions || 1138 needsRti = compiler.options.enableTypeAssertions ||
1135 compiler.backend.rtiNeed.methodNeedsRti(element); 1139 compiler.backend.rtiNeed.methodNeedsRti(element);
1136 } 1140 }
1137 } 1141 }
1138 closureMappingCache[element] = closureData;
1139 closureMappingCache[element.declaration] = closureData; 1142 closureMappingCache[element.declaration] = closureData;
1140 if (closureData.callElement != null) { 1143 if (closureData.callElement != null) {
1141 closureMappingCache[closureData.callElement] = closureData; 1144 closureMappingCache[closureData.callElement] = closureData;
1142 } 1145 }
1143 1146
1144 inNewScope(node, () { 1147 inNewScope(node, () {
1145 // If the method needs RTI, or checked mode is set, we need to 1148 // If the method needs RTI, or checked mode is set, we need to
1146 // escape the potential type variables used in that closure. 1149 // escape the potential type variables used in that closure.
1147 if (needsRti) { 1150 if (needsRti) {
1148 analyzeTypeVariables(element.type); 1151 analyzeTypeVariables(element.type);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 /// 1241 ///
1239 /// Move the below classes to a JS model eventually. 1242 /// Move the below classes to a JS model eventually.
1240 /// 1243 ///
1241 abstract class JSEntity implements Entity { 1244 abstract class JSEntity implements Entity {
1242 Entity get declaredEntity; 1245 Entity get declaredEntity;
1243 } 1246 }
1244 1247
1245 abstract class PrivatelyNamedJSEntity implements JSEntity { 1248 abstract class PrivatelyNamedJSEntity implements JSEntity {
1246 Entity get rootOfScope; 1249 Entity get rootOfScope;
1247 } 1250 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698