Chromium Code Reviews| 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, with a no-op |
| 79 // default, so tools like dart2dart can ignore the native classes. | |
| 80 native.NativeEnqueuer nativeResolutionEnqueuer(world) { | |
| 81 return new native.NativeEnqueuer(); | |
| 82 } | |
| 83 native.NativeEnqueuer nativeCodegenEnqueuer(world) { | |
| 84 return new native.NativeEnqueuer(); | |
| 85 } | |
| 86 | |
| 79 void assembleProgram(); | 87 void assembleProgram(); |
| 80 List<CompilerTask> get tasks; | 88 List<CompilerTask> get tasks; |
| 81 | 89 |
| 82 // TODO(ahe,karlklose): rename this? | 90 // TODO(ahe,karlklose): rename this? |
| 83 void dumpInferredTypes() {} | 91 void dumpInferredTypes() {} |
| 84 | 92 |
| 85 ItemCompilationContext createItemCompilationContext() { | 93 ItemCompilationContext createItemCompilationContext() { |
| 86 return new ItemCompilationContext(); | 94 return new ItemCompilationContext(); |
| 87 } | 95 } |
| 88 | 96 |
| 89 SourceString getCheckedModeHelper(DartType type) => null; | 97 SourceString getCheckedModeHelper(DartType type) => null; |
| 90 void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {} | 98 void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {} |
| 91 | 99 |
| 92 Element getInterceptor(Selector selector); | 100 Element getInterceptor(Selector selector); |
| 93 } | 101 } |
| 94 | 102 |
| 95 abstract class Compiler implements DiagnosticListener { | 103 abstract class Compiler implements DiagnosticListener { |
| 96 final Map<String, LibraryElement> libraries; | 104 final Map<String, LibraryElement> libraries; |
| 97 int nextFreeClassId = 0; | 105 int nextFreeClassId = 0; |
| 98 World world; | 106 World world; |
| 99 String assembledCode; | 107 String assembledCode; |
| 100 Types types; | 108 Types types; |
| 101 | 109 |
| 102 final bool enableMinification; | 110 final bool enableMinification; |
| 103 final bool enableTypeAssertions; | 111 final bool enableTypeAssertions; |
| 104 final bool enableUserAssertions; | 112 final bool enableUserAssertions; |
| 105 final bool enableConcreteTypeInference; | 113 final bool enableConcreteTypeInference; |
| 114 final bool enableNativeLiveTypeAnalysis; | |
| 106 | 115 |
| 107 bool disableInlining = false; | 116 bool disableInlining = false; |
| 108 | 117 |
| 109 final Tracer tracer; | 118 final Tracer tracer; |
| 110 | 119 |
| 111 CompilerTask measuredTask; | 120 CompilerTask measuredTask; |
| 112 Element _currentElement; | 121 Element _currentElement; |
| 113 LibraryElement coreLibrary; | 122 LibraryElement coreLibrary; |
| 114 LibraryElement isolateLibrary; | 123 LibraryElement isolateLibrary; |
| 115 LibraryElement jsHelperLibrary; | 124 LibraryElement jsHelperLibrary; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 203 | 212 |
| 204 bool compilationFailed = false; | 213 bool compilationFailed = false; |
| 205 | 214 |
| 206 bool hasCrashed = false; | 215 bool hasCrashed = false; |
| 207 | 216 |
| 208 Compiler({this.tracer: const Tracer(), | 217 Compiler({this.tracer: const Tracer(), |
| 209 this.enableTypeAssertions: false, | 218 this.enableTypeAssertions: false, |
| 210 this.enableUserAssertions: false, | 219 this.enableUserAssertions: false, |
| 211 this.enableConcreteTypeInference: false, | 220 this.enableConcreteTypeInference: false, |
| 212 this.enableMinification: false, | 221 this.enableMinification: false, |
| 222 this.enableNativeLiveTypeAnalysis: false, | |
| 213 bool emitJavaScript: true, | 223 bool emitJavaScript: true, |
| 214 bool generateSourceMap: true, | 224 bool generateSourceMap: true, |
| 215 bool disallowUnsafeEval: false, | 225 bool disallowUnsafeEval: false, |
| 216 List<String> strips: const []}) | 226 List<String> strips: const []}) |
| 217 : libraries = new Map<String, LibraryElement>(), | 227 : libraries = new Map<String, LibraryElement>(), |
| 218 progress = new Stopwatch() { | 228 progress = new Stopwatch() { |
| 219 progress.start(); | 229 progress.start(); |
| 220 world = new World(this); | 230 world = new World(this); |
| 221 scanner = new ScannerTask(this); | 231 scanner = new ScannerTask(this); |
| 222 dietParser = new DietParserTask(this); | 232 dietParser = new DietParserTask(this); |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 reportFatalError('Could not find $MAIN', mainApp); | 518 reportFatalError('Could not find $MAIN', mainApp); |
| 509 } else { | 519 } else { |
| 510 if (!main.isFunction()) reportFatalError('main is not a function', main); | 520 if (!main.isFunction()) reportFatalError('main is not a function', main); |
| 511 FunctionElement mainMethod = main; | 521 FunctionElement mainMethod = main; |
| 512 FunctionSignature parameters = mainMethod.computeSignature(this); | 522 FunctionSignature parameters = mainMethod.computeSignature(this); |
| 513 parameters.forEachParameter((Element parameter) { | 523 parameters.forEachParameter((Element parameter) { |
| 514 reportFatalError('main cannot have parameters', parameter); | 524 reportFatalError('main cannot have parameters', parameter); |
| 515 }); | 525 }); |
| 516 } | 526 } |
| 517 | 527 |
| 528 enqueuer.resolution.nativeEnqueuer = | |
| 529 backend.nativeResolutionEnqueuer(enqueuer.resolution); | |
|
ngeoffray
2012/11/15 12:49:57
The reason why I asked about why not initializing
| |
| 530 enqueuer.codegen.nativeEnqueuer = | |
| 531 backend.nativeCodegenEnqueuer(enqueuer.codegen); | |
| 532 | |
| 518 log('Resolving...'); | 533 log('Resolving...'); |
| 519 phase = PHASE_RESOLVING; | 534 phase = PHASE_RESOLVING; |
| 520 backend.enqueueHelpers(enqueuer.resolution); | 535 backend.enqueueHelpers(enqueuer.resolution); |
| 521 processQueue(enqueuer.resolution, main); | 536 processQueue(enqueuer.resolution, main); |
| 522 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | 537 enqueuer.resolution.logSummary(log); |
| 523 | 538 |
| 524 if (compilationFailed) return; | 539 if (compilationFailed) return; |
| 525 | 540 |
| 526 log('Inferring types...'); | 541 log('Inferring types...'); |
| 527 typesTask.onResolutionComplete(main); | 542 typesTask.onResolutionComplete(main); |
| 528 | 543 |
| 529 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution | 544 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution |
| 530 // should know this. | 545 // should know this. |
| 531 world.populate(); | 546 world.populate(); |
| 532 | 547 |
| 533 log('Compiling...'); | 548 log('Compiling...'); |
| 534 phase = PHASE_COMPILING; | 549 phase = PHASE_COMPILING; |
| 535 processQueue(enqueuer.codegen, main); | 550 processQueue(enqueuer.codegen, main); |
| 536 log('Compiled ${codegenWorld.generatedCode.length} methods.'); | 551 enqueuer.codegen.logSummary(log); |
| 537 | 552 |
| 538 if (compilationFailed) return; | 553 if (compilationFailed) return; |
| 539 | 554 |
| 540 backend.assembleProgram(); | 555 backend.assembleProgram(); |
| 541 | 556 |
| 542 checkQueues(); | 557 checkQueues(); |
| 543 } | 558 } |
| 544 | 559 |
| 545 void processQueue(Enqueuer world, Element main) { | 560 void processQueue(Enqueuer world, Element main) { |
| 546 backend.processNativeClasses(world, libraries.values); | 561 world.nativeEnqueuer.processNativeClasses(libraries.values); |
| 547 world.addToWorkList(main); | 562 world.addToWorkList(main); |
| 548 progress.reset(); | 563 progress.reset(); |
| 549 world.forEach((WorkItem work) { | 564 world.forEach((WorkItem work) { |
| 550 withCurrentElement(work.element, () => work.run(this, world)); | 565 withCurrentElement(work.element, () => work.run(this, world)); |
| 551 }); | 566 }); |
| 552 world.queueIsClosed = true; | 567 world.queueIsClosed = true; |
| 553 if (compilationFailed) return; | 568 if (compilationFailed) return; |
| 554 assert(world.checkNoEnqueuedInvokedInstanceMethods()); | 569 assert(world.checkNoEnqueuedInvokedInstanceMethods()); |
| 555 if (DUMP_INFERRED_TYPES && phase == PHASE_COMPILING) { | 570 if (DUMP_INFERRED_TYPES && phase == PHASE_COMPILING) { |
| 556 backend.dumpInferredTypes(); | 571 backend.dumpInferredTypes(); |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 903 // TODO(johnniwinther): Use [spannable] and [message] to provide better | 918 // TODO(johnniwinther): Use [spannable] and [message] to provide better |
| 904 // information on assertion errors. | 919 // information on assertion errors. |
| 905 if (condition is Function){ | 920 if (condition is Function){ |
| 906 condition = condition(); | 921 condition = condition(); |
| 907 } | 922 } |
| 908 if (spannable == null || !condition) { | 923 if (spannable == null || !condition) { |
| 909 throw new SpannableAssertionFailure(spannable, message); | 924 throw new SpannableAssertionFailure(spannable, message); |
| 910 } | 925 } |
| 911 return true; | 926 return true; |
| 912 } | 927 } |
| OLD | NEW |