OLD | NEW |
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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 } | 288 } |
289 } | 289 } |
290 processClass(cls); | 290 processClass(cls); |
291 for (Link<DartType> supertypes = cls.allSupertypes; | 291 for (Link<DartType> supertypes = cls.allSupertypes; |
292 !supertypes.isEmpty; supertypes = supertypes.tail) { | 292 !supertypes.isEmpty; supertypes = supertypes.tail) { |
293 processClass(supertypes.head.element); | 293 processClass(supertypes.head.element); |
294 } | 294 } |
295 }); | 295 }); |
296 } | 296 } |
297 | 297 |
298 void registerNewSelector(SourceString name, | 298 void registerNewSelector(Selector selector, |
299 Selector selector, | |
300 Map<SourceString, Set<Selector>> selectorsMap) { | 299 Map<SourceString, Set<Selector>> selectorsMap) { |
301 if (name != selector.name) { | 300 SourceString name = selector.name; |
302 String message = "$name != ${selector.name} (${selector.kind})"; | |
303 compiler.internalError("Wrong selector name: $message."); | |
304 } | |
305 Set<Selector> selectors = | 301 Set<Selector> selectors = |
306 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); | 302 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); |
307 if (!selectors.contains(selector)) { | 303 if (!selectors.contains(selector)) { |
308 selectors.add(selector); | 304 selectors.add(selector); |
309 handleUnseenSelector(name, selector); | 305 handleUnseenSelector(name, selector); |
310 } | 306 } |
311 } | 307 } |
312 | 308 |
313 void registerInvocation(SourceString methodName, Selector selector) { | 309 void registerInvocation(Selector selector) { |
314 task.measure(() { | 310 task.measure(() { |
315 registerNewSelector(methodName, selector, universe.invokedNames); | 311 registerNewSelector(selector, universe.invokedNames); |
316 }); | 312 }); |
317 } | 313 } |
318 | 314 |
319 void registerInvokedGetter(SourceString getterName, Selector selector) { | 315 void registerInvokedGetter(Selector selector) { |
320 task.measure(() { | 316 task.measure(() { |
321 registerNewSelector(getterName, selector, universe.invokedGetters); | 317 registerNewSelector(selector, universe.invokedGetters); |
322 }); | 318 }); |
323 } | 319 } |
324 | 320 |
325 void registerInvokedSetter(SourceString setterName, Selector selector) { | 321 void registerInvokedSetter(Selector selector) { |
326 task.measure(() { | 322 task.measure(() { |
327 registerNewSelector(setterName, selector, universe.invokedSetters); | 323 registerNewSelector(selector, universe.invokedSetters); |
328 }); | 324 }); |
329 } | 325 } |
330 | 326 |
331 /// Called when [:const Symbol(name):] is seen. | 327 /// Called when [:const Symbol(name):] is seen. |
332 void registerConstSymbol(String name, TreeElements elements) { | 328 void registerConstSymbol(String name, TreeElements elements) { |
333 // If dart:mirrors is loaded, a const symbol may be used to call a | 329 // If dart:mirrors is loaded, a const symbol may be used to call a |
334 // static/top-level method or accessor, instantiate a class, call | 330 // static/top-level method or accessor, instantiate a class, call |
335 // an instance method or accessor with the given name. | 331 // an instance method or accessor with the given name. |
336 if (!compiler.mirrorsEnabled) return; | 332 if (!compiler.mirrorsEnabled) return; |
337 | 333 |
(...skipping 19 matching lines...) Expand all Loading... |
357 } else if (element.impliesType()) { | 353 } else if (element.impliesType()) { |
358 // Don't enqueue classes, typedefs, and type variables. | 354 // Don't enqueue classes, typedefs, and type variables. |
359 } else if (Elements.isStaticOrTopLevel(element)) { | 355 } else if (Elements.isStaticOrTopLevel(element)) { |
360 registerStaticUse(element.declaration); | 356 registerStaticUse(element.declaration); |
361 } else if (element.isInstanceMember()) { | 357 } else if (element.isInstanceMember()) { |
362 if (element.isFunction()) { | 358 if (element.isFunction()) { |
363 int arity = | 359 int arity = |
364 element.asFunctionElement().requiredParameterCount(compiler); | 360 element.asFunctionElement().requiredParameterCount(compiler); |
365 Selector selector = | 361 Selector selector = |
366 new Selector.call(element.name, element.getLibrary(), arity); | 362 new Selector.call(element.name, element.getLibrary(), arity); |
367 registerInvocation(element.name, selector); | 363 registerInvocation(selector); |
368 } else if (element.isSetter()) { | 364 } else if (element.isSetter()) { |
369 Selector selector = | 365 Selector selector = |
370 new Selector.setter(element.name, element.getLibrary()); | 366 new Selector.setter(element.name, element.getLibrary()); |
371 registerInvokedSetter(element.name, selector); | 367 registerInvokedSetter(selector); |
372 } else if (element.isGetter()) { | 368 } else if (element.isGetter()) { |
373 Selector selector = | 369 Selector selector = |
374 new Selector.getter(element.name, element.getLibrary()); | 370 new Selector.getter(element.name, element.getLibrary()); |
375 registerInvokedGetter(element.name, selector); | 371 registerInvokedGetter(selector); |
376 } else if (element.isField()) { | 372 } else if (element.isField()) { |
377 Selector selector = | 373 Selector selector = |
378 new Selector.setter(element.name, element.getLibrary()); | 374 new Selector.setter(element.name, element.getLibrary()); |
379 registerInvokedSetter(element.name, selector); | 375 registerInvokedSetter(selector); |
380 selector = new Selector.getter(element.name, element.getLibrary()); | 376 selector = new Selector.getter(element.name, element.getLibrary()); |
381 registerInvokedGetter(element.name, selector); | 377 registerInvokedGetter(selector); |
382 } | 378 } |
383 } | 379 } |
384 } | 380 } |
385 | 381 |
386 /// Called when [:new Symbol(...):] is seen. | 382 /// Called when [:new Symbol(...):] is seen. |
387 void registerNewSymbol(TreeElements elements) { | 383 void registerNewSymbol(TreeElements elements) { |
388 } | 384 } |
389 | 385 |
390 void enqueueEverything() { | 386 void enqueueEverything() { |
391 if (hasEnqueuedEverything) return; | 387 if (hasEnqueuedEverything) return; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 compiler.backend.registerStaticUse(element, this); | 473 compiler.backend.registerStaticUse(element, this); |
478 } | 474 } |
479 | 475 |
480 void registerGetOfStaticFunction(FunctionElement element) { | 476 void registerGetOfStaticFunction(FunctionElement element) { |
481 registerStaticUse(element); | 477 registerStaticUse(element); |
482 registerInstantiatedClass(compiler.closureClass, | 478 registerInstantiatedClass(compiler.closureClass, |
483 compiler.globalDependencies); | 479 compiler.globalDependencies); |
484 universe.staticFunctionsNeedingGetter.add(element); | 480 universe.staticFunctionsNeedingGetter.add(element); |
485 } | 481 } |
486 | 482 |
487 void registerDynamicInvocation(SourceString methodName, Selector selector) { | 483 void registerDynamicInvocation(Selector selector) { |
488 assert(selector != null); | 484 assert(selector != null); |
489 registerInvocation(methodName, selector); | 485 registerInvocation(selector); |
490 } | 486 } |
491 | 487 |
492 void registerSelectorUse(Selector selector) { | 488 void registerSelectorUse(Selector selector) { |
493 if (selector.isGetter()) { | 489 if (selector.isGetter()) { |
494 registerInvokedGetter(selector.name, selector); | 490 registerInvokedGetter(selector); |
495 } else if (selector.isSetter()) { | 491 } else if (selector.isSetter()) { |
496 registerInvokedSetter(selector.name, selector); | 492 registerInvokedSetter(selector); |
497 } else { | 493 } else { |
498 registerInvocation(selector.name, selector); | 494 registerInvocation(selector); |
499 } | 495 } |
500 } | 496 } |
501 | 497 |
502 void registerDynamicGetter(SourceString methodName, Selector selector) { | 498 void registerDynamicGetter(Selector selector) { |
503 registerInvokedGetter(methodName, selector); | 499 registerInvokedGetter(selector); |
504 } | 500 } |
505 | 501 |
506 void registerDynamicSetter(SourceString methodName, Selector selector) { | 502 void registerDynamicSetter(Selector selector) { |
507 registerInvokedSetter(methodName, selector); | 503 registerInvokedSetter(selector); |
508 } | 504 } |
509 | 505 |
510 void registerFieldGetter(Element element) { | 506 void registerFieldGetter(Element element) { |
511 universe.fieldGetters.add(element); | 507 universe.fieldGetters.add(element); |
512 } | 508 } |
513 | 509 |
514 void registerFieldSetter(Element element) { | 510 void registerFieldSetter(Element element) { |
515 universe.fieldSetters.add(element); | 511 universe.fieldSetters.add(element); |
516 } | 512 } |
517 | 513 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 addToWorkList(compiler.isolateHelperLibrary.find( | 676 addToWorkList(compiler.isolateHelperLibrary.find( |
681 const SourceString('_callInIsolate'))); | 677 const SourceString('_callInIsolate'))); |
682 } | 678 } |
683 | 679 |
684 void enableNoSuchMethod(Element element) { | 680 void enableNoSuchMethod(Element element) { |
685 if (compiler.enabledNoSuchMethod) return; | 681 if (compiler.enabledNoSuchMethod) return; |
686 if (compiler.backend.isDefaultNoSuchMethodImplementation(element)) return; | 682 if (compiler.backend.isDefaultNoSuchMethodImplementation(element)) return; |
687 | 683 |
688 Selector selector = compiler.noSuchMethodSelector; | 684 Selector selector = compiler.noSuchMethodSelector; |
689 compiler.enabledNoSuchMethod = true; | 685 compiler.enabledNoSuchMethod = true; |
690 registerInvocation(Compiler.NO_SUCH_METHOD, selector); | 686 registerInvocation(selector); |
691 | 687 |
692 compiler.createInvocationMirrorElement = | 688 compiler.createInvocationMirrorElement = |
693 compiler.findHelper(Compiler.CREATE_INVOCATION_MIRROR); | 689 compiler.findHelper(Compiler.CREATE_INVOCATION_MIRROR); |
694 addToWorkList(compiler.createInvocationMirrorElement); | 690 addToWorkList(compiler.createInvocationMirrorElement); |
695 } | 691 } |
696 | 692 |
697 void forEach(f(WorkItem work)) { | 693 void forEach(f(WorkItem work)) { |
698 while (!queue.isEmpty) { | 694 while (!queue.isEmpty) { |
699 // TODO(johnniwinther): Find an optimal process order for resolution. | 695 // TODO(johnniwinther): Find an optimal process order for resolution. |
700 f(queue.removeLast()); | 696 f(queue.removeLast()); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 while(!queue.isEmpty) { | 759 while(!queue.isEmpty) { |
764 // TODO(johnniwinther): Find an optimal process order for codegen. | 760 // TODO(johnniwinther): Find an optimal process order for codegen. |
765 f(queue.removeLast()); | 761 f(queue.removeLast()); |
766 } | 762 } |
767 } | 763 } |
768 | 764 |
769 void _logSpecificSummary(log(message)) { | 765 void _logSpecificSummary(log(message)) { |
770 log('Compiled ${generatedCode.length} methods.'); | 766 log('Compiled ${generatedCode.length} methods.'); |
771 } | 767 } |
772 } | 768 } |
OLD | NEW |