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

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: Make expando private 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
(...skipping 11 matching lines...) Expand all
22 codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen); 22 codegen.nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(codegen);
23 resolution.nativeEnqueuer = 23 resolution.nativeEnqueuer =
24 compiler.backend.nativeResolutionEnqueuer(resolution); 24 compiler.backend.nativeResolutionEnqueuer(resolution);
25 } 25 }
26 } 26 }
27 27
28 abstract class Enqueuer { 28 abstract class Enqueuer {
29 final String name; 29 final String name;
30 final Compiler compiler; // TODO(ahe): Remove this dependency. 30 final Compiler compiler; // TODO(ahe): Remove this dependency.
31 final Function itemCompilationContextCreator; 31 final Function itemCompilationContextCreator;
32 final Map<String, Link<Element>> instanceMembersByName; 32 final Map<String, Link<Element>> instanceMembersByName
33 final Set<ClassElement> seenClasses; 33 = new Map<String, Link<Element>>();
34 final Universe universe; 34 final Set<ClassElement> seenClasses = new Set<ClassElement>();
35 final Universe universe = new Universe();
36
37 /// A reverse map from name to *all* elements with that name, not
38 /// just instance members of instantiated classes.
39 final Map<String, Link<Element>> allElementsByName
40 = new Map<String, Link<Element>>();
ngeoffray 2013/05/08 12:34:06 I think this should be in the world. It will be th
ahe 2013/05/08 21:47:53 I'm really opposed to the class World. I'll move
35 41
36 bool queueIsClosed = false; 42 bool queueIsClosed = false;
37 EnqueueTask task; 43 EnqueueTask task;
38 native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask 44 native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
39 45
40 Enqueuer(this.name, this.compiler, 46 Enqueuer(this.name, this.compiler,
41 ItemCompilationContext itemCompilationContextCreator()) 47 ItemCompilationContext itemCompilationContextCreator())
42 : this.itemCompilationContextCreator = itemCompilationContextCreator, 48 : this.itemCompilationContextCreator = itemCompilationContextCreator;
43 instanceMembersByName = new Map<String, Link<Element>>(),
44 universe = new Universe(),
45 seenClasses = new Set<ClassElement>();
46 49
47 /// Returns [:true:] if this enqueuer is the resolution enqueuer. 50 /// Returns [:true:] if this enqueuer is the resolution enqueuer.
48 bool get isResolutionQueue => false; 51 bool get isResolutionQueue => false;
49 52
50 /// Returns [:true:] if [member] has been processed by this enqueuer. 53 /// Returns [:true:] if [member] has been processed by this enqueuer.
51 bool isProcessed(Element member); 54 bool isProcessed(Element member);
52 55
53 /** 56 /**
54 * Documentation wanted -- johnniwinther 57 * Documentation wanted -- johnniwinther
55 * 58 *
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 registerNewSelector(getterName, selector, universe.invokedGetters); 268 registerNewSelector(getterName, selector, universe.invokedGetters);
266 }); 269 });
267 } 270 }
268 271
269 void registerInvokedSetter(SourceString setterName, Selector selector) { 272 void registerInvokedSetter(SourceString setterName, Selector selector) {
270 task.measure(() { 273 task.measure(() {
271 registerNewSelector(setterName, selector, universe.invokedSetters); 274 registerNewSelector(setterName, selector, universe.invokedSetters);
272 }); 275 });
273 } 276 }
274 277
278 /// Called when [:const Symbol(name):] is seen.
279 void registerConstSymbol(String name, TreeElements elements) {
280 // If dart:mirrors is loaded, a const symbol may be used to call a
281 // static/top-level method or accessor, instantiate a class, call
282 // an instance method or accessor with the given name.
283 if (compiler.mirrorSystemClass == null) return;
284
285 ensureAllElementsByName();
286
287 for (var link = allElementsByName[name];
288 link != null && !link.isEmpty;
289 link = link.tail) {
290 Element element = link.head;
291 if (Elements.isUnresolved(element)) {
ngeoffray 2013/05/08 12:34:06 Could you just avoid adding them? Also, because yo
ahe 2013/05/08 21:47:53 This is defensive programming. Whenever you look
292 // Ignore.
293 } else if (element.isConstructor()) {
294 ClassElement cls = element.declaration.getEnclosingClass();
295 registerInstantiatedType(cls.rawType, elements);
296 registerStaticUse(element.declaration);
297 } else if (element.impliesType()) {
298 // Don't enqueue classes, typedefs, and type variables.
299 } else if (Elements.isStaticOrTopLevel(element)) {
300 registerStaticUse(element.declaration);
301 } else if (element.isInstanceMember()) {
302 if (element.isFunction()) {
303 int arity =
304 element.asFunctionElement().requiredParameterCount(compiler);
305 Selector selector =
306 new Selector.call(element.name, element.getLibrary(), arity);
307 registerInvocation(element.name, selector);
308 } else if (element.isSetter()) {
309 Selector selector =
310 new Selector.setter(element.name, element.getLibrary());
311 registerInvokedSetter(element.name, selector);
312 } else if (element.isGetter()) {
313 Selector selector =
314 new Selector.getter(element.name, element.getLibrary());
315 registerInvokedGetter(element.name, selector);
316 } else if (element.isField()) {
317 Selector selector =
318 new Selector.setter(element.name, element.getLibrary());
319 registerInvokedSetter(element.name, selector);
320 selector =
321 new Selector.getter(element.name, element.getLibrary());
322 registerInvokedGetter(element.name, selector);
323 }
324 }
325 }
326 }
327
328 void ensureAllElementsByName() {
329 if (!allElementsByName.isEmpty) return;
330
331 void addMemberByName(Element element) {
332 element = element.declaration;
333 String name = element.name.slowToString();
334 Link<Element> members = const Link<Element>();
335 if (element.isLibrary()) {
336 LibraryElementX library = element;
337 Uri uri = library.canonicalUri;
338 if (uri.scheme != 'dart' && !uri.path.startsWith('_')) {
Johnni Winther 2013/05/08 08:22:08 What are you trying to compute in this block?
ahe 2013/05/08 08:57:43 Top-level members. However, some of the special c
339 members = library.localMembers;
340 // TODO(ahe): Is this right? Is this necessary?
341 name = library.getLibraryOrScriptName();
342 }
343 } else if (element.isClass() && !element.isMixinApplication) {
ngeoffray 2013/05/08 12:34:06 What could go wrong with a mixin application?
ahe 2013/05/08 21:47:53 Not sure. Added a TODO.
344 ClassElementX cls = element;
345 cls.ensureResolved(compiler);
346 members = cls.localMembers;
347 for (var link = cls.computeTypeParameters(compiler);
348 !link.isEmpty;
349 link = link.tail) {
350 addMemberByName(link.head.element);
ngeoffray 2013/05/08 12:34:06 Why do you want to add type parameters? Potential
ahe 2013/05/08 21:47:53 Yes. testNames in mirrors_test.dart will test tha
351 }
352 } else if (element.isConstructor()) {
353 SourceString source = Elements.deconstructConstructorName(
354 element.name, element.getEnclosingClass());
355 if (source == null) {
356 // source is null for unnamed constructors.
357 name = '';
358 } else {
359 name = source.slowToString();
360 }
361 }
362 allElementsByName[name] = allElementsByName.putIfAbsent(
363 name, () => const Link<Element>()).prepend(element);
364 for (var link = members; !link.isEmpty; link = link.tail) {
365 addMemberByName(link.head);
366 }
367 }
368
369 compiler.libraries.values.forEach(addMemberByName);
370 }
371
372 /// Called when [:new Symbol(...):] is seen.
373 void registerNewSymbol(TreeElements elements) {
374 }
375
275 processInstanceMembers(SourceString n, bool f(Element e)) { 376 processInstanceMembers(SourceString n, bool f(Element e)) {
276 String memberName = n.slowToString(); 377 String memberName = n.slowToString();
277 Link<Element> members = instanceMembersByName[memberName]; 378 Link<Element> members = instanceMembersByName[memberName];
278 if (members != null) { 379 if (members != null) {
279 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); 380 LinkBuilder<Element> remaining = new LinkBuilder<Element>();
280 for (; !members.isEmpty; members = members.tail) { 381 for (; !members.isEmpty; members = members.tail) {
281 if (!f(members.head)) remaining.addLast(members.head); 382 if (!f(members.head)) remaining.addLast(members.head);
282 } 383 }
283 instanceMembersByName[memberName] = remaining.toLink(); 384 instanceMembersByName[memberName] = remaining.toLink();
284 } 385 }
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 while(!queue.isEmpty) { 708 while(!queue.isEmpty) {
608 // TODO(johnniwinther): Find an optimal process order for codegen. 709 // TODO(johnniwinther): Find an optimal process order for codegen.
609 f(queue.removeLast()); 710 f(queue.removeLast());
610 } 711 }
611 } 712 }
612 713
613 void _logSpecificSummary(log(message)) { 714 void _logSpecificSummary(log(message)) {
614 log('Compiled ${generatedCode.length} methods.'); 715 log('Compiled ${generatedCode.length} methods.');
615 } 716 }
616 } 717 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698