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

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

Issue 14646031: Implement invoke, setField, and getField (unminified). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review comments. Created 7 years, 7 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 part of dart2js; 5 part of dart2js;
6 6
7 class EnqueueTask extends CompilerTask { 7 class EnqueueTask extends CompilerTask {
8 final ResolutionEnqueuer resolution; 8 final ResolutionEnqueuer resolution;
9 final CodegenEnqueuer codegen; 9 final CodegenEnqueuer codegen;
10 10
11 /// A reverse map from name to *all* elements with that name, not
12 /// just instance members of instantiated classes.
13 final Map<String, Link<Element>> allElementsByName
14 = new Map<String, Link<Element>>();
15
16 void ensureAllElementsByName() {
17 if (!allElementsByName.isEmpty) return;
18
19 void addMemberByName(Element element) {
20 element = element.declaration;
21 String name = element.name.slowToString();
22 Link<Element> members = const Link<Element>();
23 if (element.isLibrary()) {
24 LibraryElementX library = element;
25 Uri uri = library.canonicalUri;
26 if (uri.scheme != 'dart' && !uri.path.startsWith('_')) {
27 members = library.localMembers;
28 // TODO(ahe): Is this right? Is this necessary?
29 name = library.getLibraryOrScriptName();
30 }
31 } else if (element.isClass() && !element.isMixinApplication) {
32 // TODO(ahe): Investigate what makes mixin applications crash
33 // this method.
34 ClassElementX cls = element;
35 cls.ensureResolved(compiler);
36 members = cls.localMembers;
37 for (var link = cls.computeTypeParameters(compiler);
38 !link.isEmpty;
39 link = link.tail) {
40 addMemberByName(link.head.element);
41 }
42 } else if (element.isConstructor()) {
43 SourceString source = Elements.deconstructConstructorName(
44 element.name, element.getEnclosingClass());
45 if (source == null) {
46 // source is null for unnamed constructors.
47 name = '';
48 } else {
49 name = source.slowToString();
50 }
51 }
52 allElementsByName[name] = allElementsByName.putIfAbsent(
53 name, () => const Link<Element>()).prepend(element);
54 for (var link = members; !link.isEmpty; link = link.tail) {
55 addMemberByName(link.head);
56 }
57 }
58
59 compiler.libraries.values.forEach(addMemberByName);
60 }
61
62
11 String get name => 'Enqueue'; 63 String get name => 'Enqueue';
12 64
13 EnqueueTask(Compiler compiler) 65 EnqueueTask(Compiler compiler)
14 : resolution = new ResolutionEnqueuer( 66 : resolution = new ResolutionEnqueuer(
15 compiler, compiler.backend.createItemCompilationContext), 67 compiler, compiler.backend.createItemCompilationContext),
16 codegen = new CodegenEnqueuer( 68 codegen = new CodegenEnqueuer(
17 compiler, compiler.backend.createItemCompilationContext), 69 compiler, compiler.backend.createItemCompilationContext),
18 super(compiler) { 70 super(compiler) {
19 codegen.task = this; 71 codegen.task = this;
20 resolution.task = this; 72 resolution.task = this;
21 73
22 codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen); 74 codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen);
23 resolution.nativeEnqueuer = 75 resolution.nativeEnqueuer =
24 compiler.backend.nativeResolutionEnqueuer(resolution); 76 compiler.backend.nativeResolutionEnqueuer(resolution);
25 } 77 }
26 } 78 }
27 79
28 abstract class Enqueuer { 80 abstract class Enqueuer {
29 final String name; 81 final String name;
30 final Compiler compiler; // TODO(ahe): Remove this dependency. 82 final Compiler compiler; // TODO(ahe): Remove this dependency.
31 final Function itemCompilationContextCreator; 83 final Function itemCompilationContextCreator;
32 final Map<String, Link<Element>> instanceMembersByName; 84 final Map<String, Link<Element>> instanceMembersByName
33 final Set<ClassElement> seenClasses; 85 = new Map<String, Link<Element>>();
34 final Universe universe; 86 final Set<ClassElement> seenClasses = new Set<ClassElement>();
87 final Universe universe = new Universe();
35 88
36 bool queueIsClosed = false; 89 bool queueIsClosed = false;
37 EnqueueTask task; 90 EnqueueTask task;
38 native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask 91 native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
39 92
40 Enqueuer(this.name, this.compiler, 93 Enqueuer(this.name, this.compiler,
41 ItemCompilationContext itemCompilationContextCreator()) 94 ItemCompilationContext itemCompilationContextCreator())
42 : this.itemCompilationContextCreator = itemCompilationContextCreator, 95 : this.itemCompilationContextCreator = itemCompilationContextCreator;
43 instanceMembersByName = new Map<String, Link<Element>>(),
44 universe = new Universe(),
45 seenClasses = new Set<ClassElement>();
46 96
47 /// Returns [:true:] if this enqueuer is the resolution enqueuer. 97 /// Returns [:true:] if this enqueuer is the resolution enqueuer.
48 bool get isResolutionQueue => false; 98 bool get isResolutionQueue => false;
49 99
50 /// Returns [:true:] if [member] has been processed by this enqueuer. 100 /// Returns [:true:] if [member] has been processed by this enqueuer.
51 bool isProcessed(Element member); 101 bool isProcessed(Element member);
52 102
53 /** 103 /**
54 * Documentation wanted -- johnniwinther 104 * Documentation wanted -- johnniwinther
55 * 105 *
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 registerNewSelector(getterName, selector, universe.invokedGetters); 315 registerNewSelector(getterName, selector, universe.invokedGetters);
266 }); 316 });
267 } 317 }
268 318
269 void registerInvokedSetter(SourceString setterName, Selector selector) { 319 void registerInvokedSetter(SourceString setterName, Selector selector) {
270 task.measure(() { 320 task.measure(() {
271 registerNewSelector(setterName, selector, universe.invokedSetters); 321 registerNewSelector(setterName, selector, universe.invokedSetters);
272 }); 322 });
273 } 323 }
274 324
325 /// Called when [:const Symbol(name):] is seen.
326 void registerConstSymbol(String name, TreeElements elements) {
327 // If dart:mirrors is loaded, a const symbol may be used to call a
328 // static/top-level method or accessor, instantiate a class, call
329 // an instance method or accessor with the given name.
330 if (compiler.mirrorSystemClass == null) return;
331
332 task.ensureAllElementsByName();
333
334 for (var link = task.allElementsByName[name];
335 link != null && !link.isEmpty;
336 link = link.tail) {
337 Element element = link.head;
338 if (Elements.isUnresolved(element)) {
339 // Ignore.
340 } else if (element.isConstructor()) {
341 ClassElement cls = element.declaration.getEnclosingClass();
342 registerInstantiatedType(cls.rawType, elements);
343 registerStaticUse(element.declaration);
344 } else if (element.impliesType()) {
345 // Don't enqueue classes, typedefs, and type variables.
346 } else if (Elements.isStaticOrTopLevel(element)) {
347 registerStaticUse(element.declaration);
348 } else if (element.isInstanceMember()) {
349 if (element.isFunction()) {
350 int arity =
351 element.asFunctionElement().requiredParameterCount(compiler);
352 Selector selector =
353 new Selector.call(element.name, element.getLibrary(), arity);
354 registerInvocation(element.name, selector);
355 } else if (element.isSetter()) {
356 Selector selector =
357 new Selector.setter(element.name, element.getLibrary());
358 registerInvokedSetter(element.name, selector);
359 } else if (element.isGetter()) {
360 Selector selector =
361 new Selector.getter(element.name, element.getLibrary());
362 registerInvokedGetter(element.name, selector);
363 } else if (element.isField()) {
364 Selector selector =
365 new Selector.setter(element.name, element.getLibrary());
366 registerInvokedSetter(element.name, selector);
367 selector =
368 new Selector.getter(element.name, element.getLibrary());
369 registerInvokedGetter(element.name, selector);
370 }
371 }
372 }
373 }
374
375 /// Called when [:new Symbol(...):] is seen.
376 void registerNewSymbol(TreeElements elements) {
377 }
378
275 processInstanceMembers(SourceString n, bool f(Element e)) { 379 processInstanceMembers(SourceString n, bool f(Element e)) {
276 String memberName = n.slowToString(); 380 String memberName = n.slowToString();
277 Link<Element> members = instanceMembersByName[memberName]; 381 Link<Element> members = instanceMembersByName[memberName];
278 if (members != null) { 382 if (members != null) {
279 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); 383 LinkBuilder<Element> remaining = new LinkBuilder<Element>();
280 for (; !members.isEmpty; members = members.tail) { 384 for (; !members.isEmpty; members = members.tail) {
281 if (!f(members.head)) remaining.addLast(members.head); 385 if (!f(members.head)) remaining.addLast(members.head);
282 } 386 }
283 instanceMembersByName[memberName] = remaining.toLink(); 387 instanceMembersByName[memberName] = remaining.toLink();
284 } 388 }
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 while(!queue.isEmpty) { 711 while(!queue.isEmpty) {
608 // TODO(johnniwinther): Find an optimal process order for codegen. 712 // TODO(johnniwinther): Find an optimal process order for codegen.
609 f(queue.removeLast()); 713 f(queue.removeLast());
610 } 714 }
611 } 715 }
612 716
613 void _logSpecificSummary(log(message)) { 717 void _logSpecificSummary(log(message)) {
614 log('Compiled ${generatedCode.length} methods.'); 718 log('Compiled ${generatedCode.length} methods.');
615 } 719 }
616 } 720 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698