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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 final Map<String, LibraryElement> libraries; | 95 final Map<String, LibraryElement> libraries; |
| 96 int nextFreeClassId = 0; | 96 int nextFreeClassId = 0; |
| 97 World world; | 97 World world; |
| 98 String assembledCode; | 98 String assembledCode; |
| 99 Types types; | 99 Types types; |
| 100 | 100 |
| 101 final bool enableMinification; | 101 final bool enableMinification; |
| 102 final bool enableTypeAssertions; | 102 final bool enableTypeAssertions; |
| 103 final bool enableUserAssertions; | 103 final bool enableUserAssertions; |
| 104 final bool enableConcreteTypeInference; | 104 final bool enableConcreteTypeInference; |
| 105 final bool analyzeAll; | |
| 105 | 106 |
| 106 bool disableInlining = false; | 107 bool disableInlining = false; |
| 107 | 108 |
| 108 final Tracer tracer; | 109 final Tracer tracer; |
| 109 | 110 |
| 110 CompilerTask measuredTask; | 111 CompilerTask measuredTask; |
| 111 Element _currentElement; | 112 Element _currentElement; |
| 112 LibraryElement coreLibrary; | 113 LibraryElement coreLibrary; |
| 113 LibraryElement coreImplLibrary; | 114 LibraryElement coreImplLibrary; |
| 114 LibraryElement isolateLibrary; | 115 LibraryElement isolateLibrary; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 bool hasCrashed = false; | 207 bool hasCrashed = false; |
| 207 | 208 |
| 208 Compiler({this.tracer: const Tracer(), | 209 Compiler({this.tracer: const Tracer(), |
| 209 this.enableTypeAssertions: false, | 210 this.enableTypeAssertions: false, |
| 210 this.enableUserAssertions: false, | 211 this.enableUserAssertions: false, |
| 211 this.enableConcreteTypeInference: false, | 212 this.enableConcreteTypeInference: false, |
| 212 this.enableMinification: false, | 213 this.enableMinification: false, |
| 213 bool emitJavaScript: true, | 214 bool emitJavaScript: true, |
| 214 bool generateSourceMap: true, | 215 bool generateSourceMap: true, |
| 215 bool disallowUnsafeEval: false, | 216 bool disallowUnsafeEval: false, |
| 217 this.analyzeAll: false, | |
| 216 List<String> strips: const []}) | 218 List<String> strips: const []}) |
| 217 : libraries = new Map<String, LibraryElement>(), | 219 : libraries = new Map<String, LibraryElement>(), |
| 218 progress = new Stopwatch() { | 220 progress = new Stopwatch() { |
| 219 progress.start(); | 221 progress.start(); |
| 220 world = new World(this); | 222 world = new World(this); |
| 221 scanner = new ScannerTask(this); | 223 scanner = new ScannerTask(this); |
| 222 dietParser = new DietParserTask(this); | 224 dietParser = new DietParserTask(this); |
| 223 parser = new ParserTask(this); | 225 parser = new ParserTask(this); |
| 224 patchParser = new PatchParserTask(this); | 226 patchParser = new PatchParserTask(this); |
| 225 libraryLoader = new LibraryLoaderTask(this); | 227 libraryLoader = new LibraryLoaderTask(this); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 517 if (!main.isFunction()) reportFatalError('main is not a function', main); | 519 if (!main.isFunction()) reportFatalError('main is not a function', main); |
| 518 FunctionElement mainMethod = main; | 520 FunctionElement mainMethod = main; |
| 519 FunctionSignature parameters = mainMethod.computeSignature(this); | 521 FunctionSignature parameters = mainMethod.computeSignature(this); |
| 520 parameters.forEachParameter((Element parameter) { | 522 parameters.forEachParameter((Element parameter) { |
| 521 reportFatalError('main cannot have parameters', parameter); | 523 reportFatalError('main cannot have parameters', parameter); |
| 522 }); | 524 }); |
| 523 } | 525 } |
| 524 | 526 |
| 525 log('Resolving...'); | 527 log('Resolving...'); |
| 526 phase = PHASE_RESOLVING; | 528 phase = PHASE_RESOLVING; |
| 529 if (analyzeAll) libraries.forEach(fullyEnqueueLibrary); | |
| 527 backend.enqueueHelpers(enqueuer.resolution); | 530 backend.enqueueHelpers(enqueuer.resolution); |
| 528 processQueue(enqueuer.resolution, main); | 531 processQueue(enqueuer.resolution, main); |
| 529 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | 532 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
| 530 | 533 |
| 531 if (compilationFailed) return; | 534 if (compilationFailed) return; |
| 532 | 535 |
| 533 log('Inferring types...'); | 536 log('Inferring types...'); |
| 534 typesTask.onResolutionComplete(main); | 537 typesTask.onResolutionComplete(main); |
| 535 | 538 |
| 536 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution | 539 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution |
| 537 // should know this. | 540 // should know this. |
| 538 world.populate(); | 541 world.populate(); |
| 539 | 542 |
| 540 log('Compiling...'); | 543 log('Compiling...'); |
| 541 phase = PHASE_COMPILING; | 544 phase = PHASE_COMPILING; |
| 542 processQueue(enqueuer.codegen, main); | 545 processQueue(enqueuer.codegen, main); |
| 543 log('Compiled ${codegenWorld.generatedCode.length} methods.'); | 546 log('Compiled ${codegenWorld.generatedCode.length} methods.'); |
| 544 | 547 |
| 545 if (compilationFailed) return; | 548 if (compilationFailed) return; |
| 546 | 549 |
| 547 backend.assembleProgram(); | 550 backend.assembleProgram(); |
| 548 | 551 |
| 549 checkQueues(); | 552 checkQueues(); |
| 550 } | 553 } |
| 551 | 554 |
| 555 void fullyEnqueueLibrary(_, LibraryElement library) { | |
|
karlklose
2012/11/13 08:33:47
The ignored first argument looks a bit strange. Yo
ahe
2012/11/13 13:13:43
Done.
| |
| 556 library.forEachLocalMember(fullyEnqueueTopLevelElement); | |
| 557 } | |
| 558 | |
| 559 void fullyEnqueueTopLevelElement(Element element) { | |
| 560 element.computeType(this); | |
|
karlklose
2012/11/13 08:33:47
Move this computation to ensureResolved?
ahe
2012/11/13 13:13:43
Well, that wouldn't work. But making sure that al
| |
| 561 if (element.isClass()) { | |
| 562 resolver.resolve(element); | |
|
karlklose
2012/11/13 08:33:47
Why do you not use ensureResolved here? Is it to m
ahe
2012/11/13 13:13:43
Done.
| |
| 563 ClassElement cls = element; | |
| 564 for (Element member in cls.localMembers) { | |
| 565 enqueuer.resolution.addToWorkList(member); | |
| 566 } | |
| 567 } else { | |
| 568 enqueuer.resolution.addToWorkList(element); | |
| 569 } | |
| 570 } | |
| 571 | |
| 552 void processQueue(Enqueuer world, Element main) { | 572 void processQueue(Enqueuer world, Element main) { |
| 553 backend.processNativeClasses(world, libraries.values); | 573 backend.processNativeClasses(world, libraries.values); |
| 554 world.addToWorkList(main); | 574 world.addToWorkList(main); |
| 555 progress.reset(); | 575 progress.reset(); |
| 556 world.forEach((WorkItem work) { | 576 world.forEach((WorkItem work) { |
| 557 withCurrentElement(work.element, () => work.run(this, world)); | 577 withCurrentElement(work.element, () => work.run(this, world)); |
| 558 }); | 578 }); |
| 559 world.queueIsClosed = true; | 579 world.queueIsClosed = true; |
| 560 if (compilationFailed) return; | 580 if (compilationFailed) return; |
| 561 assert(world.checkNoEnqueuedInvokedInstanceMethods()); | 581 assert(world.checkNoEnqueuedInvokedInstanceMethods()); |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 // TODO(johnniwinther): Use [spannable] and [message] to provide better | 930 // TODO(johnniwinther): Use [spannable] and [message] to provide better |
| 911 // information on assertion errors. | 931 // information on assertion errors. |
| 912 if (condition is Function){ | 932 if (condition is Function){ |
| 913 condition = condition(); | 933 condition = condition(); |
| 914 } | 934 } |
| 915 if (spannable == null || !condition) { | 935 if (spannable == null || !condition) { |
| 916 throw new SpannableAssertionFailure(spannable, message); | 936 throw new SpannableAssertionFailure(spannable, message); |
| 917 } | 937 } |
| 918 return true; | 938 return true; |
| 919 } | 939 } |
| OLD | NEW |