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 /** | 7 /** |
8 * If true, print a warning for each method that was resolved, but not | 8 * If true, print a warning for each method that was resolved, but not |
9 * compiled. | 9 * compiled. |
10 */ | 10 */ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 : this.constantSystem = constantSystem; | 67 : this.constantSystem = constantSystem; |
68 | 68 |
69 void enqueueAllTopLevelFunctions(LibraryElement lib, Enqueuer world) { | 69 void enqueueAllTopLevelFunctions(LibraryElement lib, Enqueuer world) { |
70 lib.forEachExport((Element e) { | 70 lib.forEachExport((Element e) { |
71 if (e.isFunction()) world.addToWorkList(e); | 71 if (e.isFunction()) world.addToWorkList(e); |
72 }); | 72 }); |
73 } | 73 } |
74 | 74 |
75 void enqueueHelpers(Enqueuer world); | 75 void enqueueHelpers(Enqueuer world); |
76 void codegen(WorkItem work); | 76 void codegen(WorkItem work); |
77 void processNativeClasses(Enqueuer world, | 77 |
78 Collection<LibraryElement> libraries); | 78 // The backend determines the native resolution enqueuer so tools like |
| 79 // dart2dart can ignore the native classes. |
| 80 NativeEnqueuer nativeResolutionEnqueuer(world); |
| 81 NativeEnqueuer nativeCodegenEnqueuer(world); |
| 82 |
79 void assembleProgram(); | 83 void assembleProgram(); |
80 List<CompilerTask> get tasks; | 84 List<CompilerTask> get tasks; |
81 | 85 |
82 // TODO(ahe,karlklose): rename this? | 86 // TODO(ahe,karlklose): rename this? |
83 void dumpInferredTypes() {} | 87 void dumpInferredTypes() {} |
84 | 88 |
85 ItemCompilationContext createItemCompilationContext() { | 89 ItemCompilationContext createItemCompilationContext() { |
86 return new ItemCompilationContext(); | 90 return new ItemCompilationContext(); |
87 } | 91 } |
88 | 92 |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 reportFatalError('Could not find $MAIN', mainApp); | 518 reportFatalError('Could not find $MAIN', mainApp); |
515 } else { | 519 } else { |
516 if (!main.isFunction()) reportFatalError('main is not a function', main); | 520 if (!main.isFunction()) reportFatalError('main is not a function', main); |
517 FunctionElement mainMethod = main; | 521 FunctionElement mainMethod = main; |
518 FunctionSignature parameters = mainMethod.computeSignature(this); | 522 FunctionSignature parameters = mainMethod.computeSignature(this); |
519 parameters.forEachParameter((Element parameter) { | 523 parameters.forEachParameter((Element parameter) { |
520 reportFatalError('main cannot have parameters', parameter); | 524 reportFatalError('main cannot have parameters', parameter); |
521 }); | 525 }); |
522 } | 526 } |
523 | 527 |
| 528 enqueuer.resolution.nativeEnqueuer = |
| 529 backend.nativeResolutionEnqueuer(enqueuer.resolution); |
| 530 enqueuer.codegen.nativeEnqueuer = |
| 531 backend.nativeCodegenEnqueuer(enqueuer.codegen); |
| 532 |
524 log('Resolving...'); | 533 log('Resolving...'); |
525 phase = PHASE_RESOLVING; | 534 phase = PHASE_RESOLVING; |
526 backend.enqueueHelpers(enqueuer.resolution); | 535 backend.enqueueHelpers(enqueuer.resolution); |
527 processQueue(enqueuer.resolution, main); | 536 processQueue(enqueuer.resolution, main); |
528 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | 537 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
| 538 log('Resolved ${enqueuer.resolution.nativeEnqueuer.registeredClasses.length}
native elements used, ' |
| 539 '${enqueuer.resolution.nativeEnqueuer.unusedClasses.length} native eleme
nts dead.'); |
529 | 540 |
530 if (compilationFailed) return; | 541 if (compilationFailed) return; |
531 | 542 |
532 log('Inferring types...'); | 543 log('Inferring types...'); |
533 typesTask.onResolutionComplete(main); | 544 typesTask.onResolutionComplete(main); |
534 | 545 |
535 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution | 546 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution |
536 // should know this. | 547 // should know this. |
537 world.populate(); | 548 world.populate(); |
538 | 549 |
539 log('Compiling...'); | 550 log('Compiling...'); |
540 phase = PHASE_COMPILING; | 551 phase = PHASE_COMPILING; |
541 processQueue(enqueuer.codegen, main); | 552 processQueue(enqueuer.codegen, main); |
542 log('Compiled ${codegenWorld.generatedCode.length} methods.'); | 553 log('Compiled ${codegenWorld.generatedCode.length} methods.'); |
| 554 log('Compiled ${enqueuer.codegen.nativeEnqueuer.registeredClasses.length} na
tive classes, ' |
| 555 '${enqueuer.codegen.nativeEnqueuer.unusedClasses.length} native classes
omitted.'); |
543 | 556 |
544 if (compilationFailed) return; | 557 if (compilationFailed) return; |
545 | 558 |
546 backend.assembleProgram(); | 559 backend.assembleProgram(); |
547 | 560 |
548 checkQueues(); | 561 checkQueues(); |
549 } | 562 } |
550 | 563 |
551 void processQueue(Enqueuer world, Element main) { | 564 void processQueue(Enqueuer world, Element main) { |
552 backend.processNativeClasses(world, libraries.values); | 565 world.nativeEnqueuer.processNativeClasses(libraries.values); |
553 world.addToWorkList(main); | 566 world.addToWorkList(main); |
554 progress.reset(); | 567 progress.reset(); |
555 world.forEach((WorkItem work) { | 568 world.forEach((WorkItem work) { |
556 withCurrentElement(work.element, () => work.run(this, world)); | 569 withCurrentElement(work.element, () => work.run(this, world)); |
557 }); | 570 }); |
558 world.queueIsClosed = true; | 571 world.queueIsClosed = true; |
559 if (compilationFailed) return; | 572 if (compilationFailed) return; |
560 assert(world.checkNoEnqueuedInvokedInstanceMethods()); | 573 assert(world.checkNoEnqueuedInvokedInstanceMethods()); |
561 if (DUMP_INFERRED_TYPES && phase == PHASE_COMPILING) { | 574 if (DUMP_INFERRED_TYPES && phase == PHASE_COMPILING) { |
562 backend.dumpInferredTypes(); | 575 backend.dumpInferredTypes(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 if (phase == PHASE_RESOLVING) { | 658 if (phase == PHASE_RESOLVING) { |
646 log('Resolved ${enqueuer.resolution.resolvedElements.length} ' | 659 log('Resolved ${enqueuer.resolution.resolvedElements.length} ' |
647 'elements.'); | 660 'elements.'); |
648 progress.reset(); | 661 progress.reset(); |
649 } | 662 } |
650 } | 663 } |
651 Element element = work.element; | 664 Element element = work.element; |
652 TreeElements result = world.getCachedElements(element); | 665 TreeElements result = world.getCachedElements(element); |
653 if (result != null) return result; | 666 if (result != null) return result; |
654 if (!identical(world, enqueuer.resolution)) { | 667 if (!identical(world, enqueuer.resolution)) { |
| 668 throw 'Internal error: unresolved element: $element.'; |
655 internalErrorOnElement(element, | 669 internalErrorOnElement(element, |
656 'Internal error: unresolved element: $element.'); | 670 'Internal error: unresolved element: $element.'); |
657 } | 671 } |
658 result = analyzeElement(element); | 672 result = analyzeElement(element); |
659 assert(invariant(element, element.isDeclaration)); | 673 assert(invariant(element, element.isDeclaration)); |
660 enqueuer.resolution.resolvedElements[element] = result; | 674 enqueuer.resolution.resolvedElements[element] = result; |
661 return result; | 675 return result; |
662 } | 676 } |
663 | 677 |
664 void codegen(WorkItem work, Enqueuer world) { | 678 void codegen(WorkItem work, Enqueuer world) { |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 // TODO(johnniwinther): Use [spannable] and [message] to provide better | 923 // TODO(johnniwinther): Use [spannable] and [message] to provide better |
910 // information on assertion errors. | 924 // information on assertion errors. |
911 if (condition is Function){ | 925 if (condition is Function){ |
912 condition = condition(); | 926 condition = condition(); |
913 } | 927 } |
914 if (spannable == null || !condition) { | 928 if (spannable == null || !condition) { |
915 throw new SpannableAssertionFailure(spannable, message); | 929 throw new SpannableAssertionFailure(spannable, message); |
916 } | 930 } |
917 return true; | 931 return true; |
918 } | 932 } |
OLD | NEW |