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

Side by Side Diff: lib/compiler/implementation/enqueue.dart

Issue 10534109: Use simple loop tracking instead of size to determine if (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add comment. Created 8 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 | Annotate | Revision Log
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 class EnqueueTask extends CompilerTask { 5 class EnqueueTask extends CompilerTask {
6 final Enqueuer codegen; 6 final Enqueuer codegen;
7 final Enqueuer resolution; 7 final Enqueuer resolution;
8 8
9 String get name() => 'Enqueue'; 9 String get name() => 'Enqueue';
10 10
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 // when resolveType is called. 141 // when resolveType is called.
142 compiler.resolveClass(cls); 142 compiler.resolveClass(cls);
143 cls.members.forEach(processInstantiatedClassMember); 143 cls.members.forEach(processInstantiatedClassMember);
144 cls = cls.superclass; 144 cls = cls.superclass;
145 } 145 }
146 }); 146 });
147 } 147 }
148 148
149 void registerNewSelector(SourceString name, 149 void registerNewSelector(SourceString name,
150 Selector selector, 150 Selector selector,
151 Map<SourceString, Set<Selector>> selectorsMap) { 151 Map<SourceString, Set<Selector>> selectorsMap,
152 [bool inLoop]) {
ngeoffray 2012/06/12 09:17:40 I wouldn't let the enqueuer be aware of such consi
Mads Ager (google) 2012/06/12 11:01:56 Good point. Removed.
152 Set<Selector> selectors = 153 Set<Selector> selectors =
153 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); 154 selectorsMap.putIfAbsent(name, () => new Set<Selector>());
154 if (!selectors.contains(selector)) { 155 if (!selectors.contains(selector)) {
155 selectors.add(selector); 156 selectors.add(selector);
156 handleUnseenSelector(name, selector); 157 handleUnseenSelector(name, selector, inLoop);
157 } 158 }
158 } 159 }
159 160
160 void registerInvocation(SourceString methodName, Selector selector) { 161 void registerInvocation(SourceString methodName,
162 Selector selector,
163 [bool inLoop]) {
161 task.measure(() { 164 task.measure(() {
162 registerNewSelector(methodName, selector, universe.invokedNames); 165 registerNewSelector(methodName, selector, universe.invokedNames, inLoop);
163 }); 166 });
164 } 167 }
165 168
166 void registerGetter(SourceString getterName, Selector selector) { 169 void registerGetter(SourceString getterName, Selector selector) {
167 task.measure(() { 170 task.measure(() {
168 registerNewSelector(getterName, selector, universe.invokedGetters); 171 registerNewSelector(getterName, selector, universe.invokedGetters);
169 }); 172 });
170 } 173 }
171 174
172 void registerSetter(SourceString setterName, Selector selector) { 175 void registerSetter(SourceString setterName, Selector selector) {
173 task.measure(() { 176 task.measure(() {
174 registerNewSelector(setterName, selector, universe.invokedSetters); 177 registerNewSelector(setterName, selector, universe.invokedSetters);
175 }); 178 });
176 } 179 }
177 180
178 processInstanceMembers(SourceString n, bool f(Element e)) { 181 processInstanceMembers(SourceString n, bool f(Element e)) {
179 String memberName = n.slowToString(); 182 String memberName = n.slowToString();
180 Link<Element> members = instanceMembersByName[memberName]; 183 Link<Element> members = instanceMembersByName[memberName];
181 if (members !== null) { 184 if (members !== null) {
182 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); 185 LinkBuilder<Element> remaining = new LinkBuilder<Element>();
183 for (; !members.isEmpty(); members = members.tail) { 186 for (; !members.isEmpty(); members = members.tail) {
184 if (!f(members.head)) remaining.addLast(members.head); 187 if (!f(members.head)) remaining.addLast(members.head);
185 } 188 }
186 instanceMembersByName[memberName] = remaining.toLink(); 189 instanceMembersByName[memberName] = remaining.toLink();
187 } 190 }
188 } 191 }
189 192
190 void handleUnseenSelector(SourceString methodName, Selector selector) { 193 void handleUnseenSelector(SourceString methodName,
194 Selector selector,
195 [bool inLoop]) {
191 processInstanceMembers(methodName, (Element member) { 196 processInstanceMembers(methodName, (Element member) {
192 if (selector.applies(member, compiler)) { 197 if (selector.applies(member, compiler)) {
198 if (inLoop && member is FunctionElement) member.calledInLoop = true;
193 addToWorkList(member); 199 addToWorkList(member);
194 return true; 200 return true;
195 } 201 }
196 return false; 202 return false;
197 }); 203 });
198 } 204 }
199 205
200 void registerStaticUse(Element element) { 206 void registerStaticUse(Element element) {
201 addToWorkList(element); 207 addToWorkList(element);
202 } 208 }
203 209
204 void registerGetOfStaticFunction(FunctionElement element) { 210 void registerGetOfStaticFunction(FunctionElement element) {
205 registerStaticUse(element); 211 registerStaticUse(element);
206 universe.staticFunctionsNeedingGetter.add(element); 212 universe.staticFunctionsNeedingGetter.add(element);
207 } 213 }
208 214
209 void registerDynamicInvocation(SourceString methodName, Selector selector) { 215 void registerDynamicInvocation(SourceString methodName,
216 Selector selector,
217 [bool inLoop]) {
210 assert(selector !== null); 218 assert(selector !== null);
211 registerInvocation(methodName, selector); 219 registerInvocation(methodName, selector, inLoop);
212 } 220 }
213 221
214 void registerDynamicInvocationOf(Element element) { 222 void registerDynamicInvocationOf(Element element) {
215 addToWorkList(element); 223 addToWorkList(element);
216 } 224 }
217 225
218 void registerDynamicGetter(SourceString methodName, Selector selector) { 226 void registerDynamicGetter(SourceString methodName, Selector selector) {
219 registerGetter(methodName, selector); 227 registerGetter(methodName, selector);
220 } 228 }
221 229
222 void registerDynamicSetter(SourceString methodName, Selector selector) { 230 void registerDynamicSetter(SourceString methodName, Selector selector) {
223 registerSetter(methodName, selector); 231 registerSetter(methodName, selector);
224 } 232 }
225 233
226 // TODO(ngeoffray): This should get a type. 234 // TODO(ngeoffray): This should get a type.
227 void registerIsCheck(Element element) { 235 void registerIsCheck(Element element) {
228 universe.isChecks.add(element); 236 universe.isChecks.add(element);
229 } 237 }
230 } 238 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698