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

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

Issue 11304021: Add NativeEnqueuer to work with the Enqueuer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month 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 part of dart2js; 5 part of dart2js;
6 6
7 class EnqueueTask extends CompilerTask { 7 class EnqueueTask extends CompilerTask {
8 final Enqueuer codegen; 8 final Enqueuer codegen;
9 final Enqueuer resolution; 9 final Enqueuer resolution;
10 10
11 String get name => 'Enqueue'; 11 String get name => 'Enqueue';
12 12
13 EnqueueTask(Compiler compiler) 13 EnqueueTask(Compiler compiler)
14 : codegen = new Enqueuer('codegen enqueuer', compiler, 14 : codegen = new Enqueuer('codegen enqueuer', compiler,
15 compiler.backend.createItemCompilationContext), 15 compiler.backend.createItemCompilationContext),
16 resolution = new Enqueuer('resolution enqueuer', compiler, 16 resolution = new Enqueuer('resolution enqueuer', compiler,
17 compiler.backend.createItemCompilationContext), 17 compiler.backend.createItemCompilationContext),
18 super(compiler) { 18 super(compiler) {
19 codegen.task = this; 19 codegen.task = this;
20 resolution.task = this; 20 resolution.task = this;
21
22 codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen);
23 resolution.nativeEnqueuer =
24 compiler.backend.nativeResolutionEnqueuer(resolution);
21 } 25 }
22 } 26 }
23 27
24 class Enqueuer { 28 class Enqueuer {
25 final String name; 29 final String name;
26 final Compiler compiler; // TODO(ahe): Remove this dependency. 30 final Compiler compiler; // TODO(ahe): Remove this dependency.
27 final Function itemCompilationContextCreator; 31 final Function itemCompilationContextCreator;
28 final Map<String, Link<Element>> instanceMembersByName; 32 final Map<String, Link<Element>> instanceMembersByName;
29 final Set<ClassElement> seenClasses; 33 final Set<ClassElement> seenClasses;
30 final Universe universe; 34 final Universe universe;
31 final Queue<WorkItem> queue; 35 final Queue<WorkItem> queue;
32 36
33 /** 37 /**
34 * Map from declaration elements to the [TreeElements] object holding the 38 * Map from declaration elements to the [TreeElements] object holding the
35 * resolution mapping for the element implementation. 39 * resolution mapping for the element implementation.
36 * 40 *
37 * Invariant: Key elements are declaration elements. 41 * Invariant: Key elements are declaration elements.
38 */ 42 */
39 final Map<Element, TreeElements> resolvedElements; 43 final Map<Element, TreeElements> resolvedElements;
40 44
41 bool queueIsClosed = false; 45 bool queueIsClosed = false;
42 EnqueueTask task; 46 EnqueueTask task;
47 native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
43 48
44 Enqueuer(this.name, this.compiler, 49 Enqueuer(this.name, this.compiler,
45 ItemCompilationContext itemCompilationContextCreator()) 50 ItemCompilationContext itemCompilationContextCreator())
46 : this.itemCompilationContextCreator = itemCompilationContextCreator, 51 : this.itemCompilationContextCreator = itemCompilationContextCreator,
47 instanceMembersByName = new Map<String, Link<Element>>(), 52 instanceMembersByName = new Map<String, Link<Element>>(),
48 seenClasses = new Set<ClassElement>(), 53 seenClasses = new Set<ClassElement>(),
49 universe = new Universe(), 54 universe = new Universe(),
50 queue = new Queue<WorkItem>(), 55 queue = new Queue<WorkItem>(),
51 resolvedElements = new Map<Element, TreeElements>(); 56 resolvedElements = new Map<Element, TreeElements>();
52 57
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 compiler.enabledInvokeOn = true; 114 compiler.enabledInvokeOn = true;
110 } 115 }
111 116
112 // Enable isolate support if we start using something from the 117 // Enable isolate support if we start using something from the
113 // isolate library. 118 // isolate library.
114 LibraryElement library = element.getLibrary(); 119 LibraryElement library = element.getLibrary();
115 if (!compiler.hasIsolateSupport() 120 if (!compiler.hasIsolateSupport()
116 && library.uri.toString() == 'dart:isolate') { 121 && library.uri.toString() == 'dart:isolate') {
117 compiler.enableIsolateSupport(library); 122 compiler.enableIsolateSupport(library);
118 } 123 }
124
125 nativeEnqueuer.registerElement(element);
119 } 126 }
120 127
121 /** 128 /**
122 * Documentation wanted -- johnniwinther 129 * Documentation wanted -- johnniwinther
123 * 130 *
124 * Invariant: [element] must be a declaration element. 131 * Invariant: [element] must be a declaration element.
125 */ 132 */
126 void eagerRecompile(Element element) { 133 void eagerRecompile(Element element) {
127 assert(invariant(element, element.isDeclaration)); 134 assert(invariant(element, element.isDeclaration));
128 universe.generatedCode.remove(element); 135 universe.generatedCode.remove(element);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 } 168 }
162 169
163 /** 170 /**
164 * Documentation wanted -- johnniwinther 171 * Documentation wanted -- johnniwinther
165 */ 172 */
166 void processInstantiatedClassMember(ClassElement cls, Element member) { 173 void processInstantiatedClassMember(ClassElement cls, Element member) {
167 assert(invariant(member, member.isDeclaration)); 174 assert(invariant(member, member.isDeclaration));
168 if (universe.generatedCode.containsKey(member)) return; 175 if (universe.generatedCode.containsKey(member)) return;
169 if (resolvedElements[member] != null) return; 176 if (resolvedElements[member] != null) return;
170 if (!member.isInstanceMember()) return; 177 if (!member.isInstanceMember()) return;
171 if (member.isField()) return; 178 if (member.isField()) {
179 // Native fields need to go into instanceMembersByName as they are virtual
180 // instantiation points and escape points.
181 if (!member.enclosingElement.isNative()) return;
182 }
172 183
173 String memberName = member.name.slowToString(); 184 String memberName = member.name.slowToString();
174 Link<Element> members = instanceMembersByName.putIfAbsent( 185 Link<Element> members = instanceMembersByName.putIfAbsent(
175 memberName, () => const Link<Element>()); 186 memberName, () => const Link<Element>());
176 instanceMembersByName[memberName] = members.prepend(member); 187 instanceMembersByName[memberName] = members.prepend(member);
177 188
178 if (member.kind == ElementKind.FUNCTION) { 189 if (member.kind == ElementKind.FUNCTION) {
179 if (member.name == Compiler.NO_SUCH_METHOD) { 190 if (member.name == Compiler.NO_SUCH_METHOD) {
180 compiler.enableNoSuchMethod(member); 191 compiler.enableNoSuchMethod(member);
181 } 192 }
(...skipping 11 matching lines...) Expand all
193 } 204 }
194 } else if (member.kind == ElementKind.GETTER) { 205 } else if (member.kind == ElementKind.GETTER) {
195 if (universe.hasInvokedGetter(member, compiler)) { 206 if (universe.hasInvokedGetter(member, compiler)) {
196 return addToWorkList(member); 207 return addToWorkList(member);
197 } 208 }
198 // We don't know what selectors the returned closure accepts. If 209 // We don't know what selectors the returned closure accepts. If
199 // the set contains any selector we have to assume that it matches. 210 // the set contains any selector we have to assume that it matches.
200 if (universe.hasInvocation(member, compiler)) { 211 if (universe.hasInvocation(member, compiler)) {
201 return addToWorkList(member); 212 return addToWorkList(member);
202 } 213 }
203 } else if (identical(member.kind, ElementKind.SETTER)) { 214 } else if (member.kind == ElementKind.SETTER) {
204 if (universe.hasInvokedSetter(member, compiler)) { 215 if (universe.hasInvokedSetter(member, compiler)) {
205 return addToWorkList(member); 216 return addToWorkList(member);
206 } 217 }
218 } else if (member.kind == ElementKind.FIELD &&
219 member.enclosingElement.isNative()) {
220 if (universe.hasInvokedGetter(member, compiler) ||
221 universe.hasInvocation(member, compiler)) {
222 nativeEnqueuer.registerFieldLoad(member);
223 }
224 if (universe.hasInvokedSetter(member, compiler)) {
225 nativeEnqueuer.registerFieldStore(member);
226 }
207 } 227 }
208 } 228 }
209 229
210 void onRegisterInstantiatedClass(ClassElement cls) { 230 void onRegisterInstantiatedClass(ClassElement cls) {
211 task.measure(() { 231 task.measure(() {
212 // The class must be resolved to compute the set of all 232 // The class must be resolved to compute the set of all
213 // supertypes. 233 // supertypes.
214 cls.ensureResolved(compiler); 234 cls.ensureResolved(compiler);
215 235
216 for (Link<DartType> supertypes = cls.allSupertypesAndSelf; 236 for (Link<DartType> supertypes = cls.allSupertypesAndSelf;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 for (; !members.isEmpty; members = members.tail) { 306 for (; !members.isEmpty; members = members.tail) {
287 if (!f(members.head)) remaining.addLast(members.head); 307 if (!f(members.head)) remaining.addLast(members.head);
288 } 308 }
289 instanceMembersByName[memberName] = remaining.toLink(); 309 instanceMembersByName[memberName] = remaining.toLink();
290 } 310 }
291 } 311 }
292 312
293 void handleUnseenSelector(SourceString methodName, Selector selector) { 313 void handleUnseenSelector(SourceString methodName, Selector selector) {
294 processInstanceMembers(methodName, (Element member) { 314 processInstanceMembers(methodName, (Element member) {
295 if (selector.applies(member, compiler)) { 315 if (selector.applies(member, compiler)) {
296 addToWorkList(member); 316 if (member.isField() && member.enclosingElement.isNative()) {
317 if (selector.isGetter() || selector.isCall()) {
318 nativeEnqueuer.registerFieldLoad(member);
319 // We have to also handle storing to the field because we only get
320 // one look at each member and there might be a store we have not
321 // seen yet.
322 // TODO(sra): Process fields for storing separately.
323 nativeEnqueuer.registerFieldStore(member);
324 } else {
325 nativeEnqueuer.registerFieldStore(member);
326 // We have to also handle loading from the field because we only get
327 // one look at each member and there might be a load we have not
328 // seen yet.
329 // TODO(sra): Process fields for storing separately.
330 nativeEnqueuer.registerFieldLoad(member);
331 }
332 } else {
333 addToWorkList(member);
334 }
297 return true; 335 return true;
298 } 336 }
299 return false; 337 return false;
300 }); 338 });
301 } 339 }
302 340
303 /** 341 /**
304 * Documentation wanted -- johnniwinther 342 * Documentation wanted -- johnniwinther
305 * 343 *
306 * Invariant: [element] must be a declaration element. 344 * Invariant: [element] must be a declaration element.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 } 398 }
361 399
362 void forEach(f(WorkItem work)) { 400 void forEach(f(WorkItem work)) {
363 while (!queue.isEmpty) { 401 while (!queue.isEmpty) {
364 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst? 402 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst?
365 } 403 }
366 } 404 }
367 405
368 String toString() => 'Enqueuer($name)'; 406 String toString() => 'Enqueuer($name)';
369 407
408 void logSummary(log(message)) {
409 log(isResolutionQueue
410 ? 'Resolved ${resolvedElements.length} elements.'
411 : 'Compiled ${universe.generatedCode.length} methods.');
412 nativeEnqueuer.logSummary(log);
413 }
414
370 registerUsedSelector(Selector selector) { 415 registerUsedSelector(Selector selector) {
371 Element interceptor = compiler.backend.getInterceptor(selector); 416 Element interceptor = compiler.backend.getInterceptor(selector);
372 if (interceptor != null) { 417 if (interceptor != null) {
373 registerStaticUse(interceptor); 418 registerStaticUse(interceptor);
374 } 419 }
375 } 420 }
376 } 421 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698