| 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 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 // this way. | 485 // this way. |
| 486 withCurrentElement(dynamicClass, () { | 486 withCurrentElement(dynamicClass, () { |
| 487 library.addToScope(dynamicClass, this); | 487 library.addToScope(dynamicClass, this); |
| 488 }); | 488 }); |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 | 491 |
| 492 LibraryElement scanBuiltinLibrary(String filename); | 492 LibraryElement scanBuiltinLibrary(String filename); |
| 493 | 493 |
| 494 void initializeSpecialClasses() { | 494 void initializeSpecialClasses() { |
| 495 final List missingClasses = []; | 495 final List missingCoreClasses = []; |
| 496 ClassElement lookupSpecialClass(SourceString name) { | 496 ClassElement lookupCoreClass(SourceString name) { |
| 497 ClassElement result = coreLibrary.find(name); | 497 ClassElement result = coreLibrary.find(name); |
| 498 if (result == null) { | 498 if (result == null) { |
| 499 missingClasses.add(name.slowToString()); | 499 missingCoreClasses.add(name.slowToString()); |
| 500 } | 500 } |
| 501 return result; | 501 return result; |
| 502 } | 502 } |
| 503 objectClass = lookupSpecialClass(const SourceString('Object')); | 503 objectClass = lookupCoreClass(const SourceString('Object')); |
| 504 boolClass = lookupSpecialClass(const SourceString('bool')); | 504 boolClass = lookupCoreClass(const SourceString('bool')); |
| 505 numClass = lookupSpecialClass(const SourceString('num')); | 505 numClass = lookupCoreClass(const SourceString('num')); |
| 506 intClass = lookupSpecialClass(const SourceString('int')); | 506 intClass = lookupCoreClass(const SourceString('int')); |
| 507 doubleClass = lookupSpecialClass(const SourceString('double')); | 507 doubleClass = lookupCoreClass(const SourceString('double')); |
| 508 stringClass = lookupSpecialClass(const SourceString('String')); | 508 stringClass = lookupCoreClass(const SourceString('String')); |
| 509 functionClass = lookupSpecialClass(const SourceString('Function')); | 509 functionClass = lookupCoreClass(const SourceString('Function')); |
| 510 listClass = lookupSpecialClass(const SourceString('List')); | 510 listClass = lookupCoreClass(const SourceString('List')); |
| 511 typeClass = lookupSpecialClass(const SourceString('Type')); | 511 typeClass = lookupCoreClass(const SourceString('Type')); |
| 512 mapClass = lookupSpecialClass(const SourceString('Map')); | 512 mapClass = lookupCoreClass(const SourceString('Map')); |
| 513 if (!missingCoreClasses.isEmpty) { |
| 514 internalErrorOnElement(coreLibrary, |
| 515 'dart:core library does not contain required classes: ' |
| 516 '$missingCoreClasses'); |
| 517 } |
| 518 |
| 519 final List missingHelperClasses = []; |
| 520 ClassElement lookupHelperClass(SourceString name) { |
| 521 ClassElement result = jsHelperLibrary.find(name); |
| 522 if (result == null) { |
| 523 missingHelperClasses.add(name.slowToString()); |
| 524 } |
| 525 return result; |
| 526 } |
| 513 jsInvocationMirrorClass = | 527 jsInvocationMirrorClass = |
| 514 lookupSpecialClass(const SourceString('JSInvocationMirror')); | 528 lookupHelperClass(const SourceString('JSInvocationMirror')); |
| 515 closureClass = lookupSpecialClass(const SourceString('Closure')); | 529 closureClass = lookupHelperClass(const SourceString('Closure')); |
| 516 dynamicClass = lookupSpecialClass(const SourceString('Dynamic_')); | 530 dynamicClass = lookupHelperClass(const SourceString('Dynamic_')); |
| 517 nullClass = lookupSpecialClass(const SourceString('Null')); | 531 nullClass = lookupHelperClass(const SourceString('Null')); |
| 532 if (!missingHelperClasses.isEmpty) { |
| 533 internalErrorOnElement(jsHelperLibrary, |
| 534 'dart:_js_helper library does not contain required classes: ' |
| 535 '$missingHelperClasses'); |
| 536 } |
| 537 |
| 518 types = new Types(this, dynamicClass); | 538 types = new Types(this, dynamicClass); |
| 519 if (!missingClasses.isEmpty) { | |
| 520 cancel('core library does not contain required classes: $missingClasses'); | |
| 521 } | |
| 522 } | 539 } |
| 523 | 540 |
| 524 void scanBuiltinLibraries() { | 541 void scanBuiltinLibraries() { |
| 525 jsHelperLibrary = scanBuiltinLibrary('_js_helper'); | 542 jsHelperLibrary = scanBuiltinLibrary('_js_helper'); |
| 526 interceptorsLibrary = scanBuiltinLibrary('_interceptors'); | 543 interceptorsLibrary = scanBuiltinLibrary('_interceptors'); |
| 527 foreignLibrary = scanBuiltinLibrary('_foreign_helper'); | 544 foreignLibrary = scanBuiltinLibrary('_foreign_helper'); |
| 528 isolateHelperLibrary = scanBuiltinLibrary('_isolate_helper'); | 545 isolateHelperLibrary = scanBuiltinLibrary('_isolate_helper'); |
| 529 // The helper library does not use the native language extension, | 546 // The helper library does not use the native language extension, |
| 530 // so we manually set the native classes this library defines. | 547 // so we manually set the native classes this library defines. |
| 531 // TODO(ngeoffray): Enable annotations on these classes. | 548 // TODO(ngeoffray): Enable annotations on these classes. |
| 532 ClassElement cls = | 549 ClassElement cls = |
| 533 isolateHelperLibrary.find(const SourceString('_WorkerStub')); | 550 isolateHelperLibrary.find(const SourceString('_WorkerStub')); |
| 534 cls.setNative('"*Worker"'); | 551 cls.setNative('"*Worker"'); |
| 535 | 552 |
| 536 // The core library was loaded and patched before jsHelperLibrary was | |
| 537 // initialized, so it wasn't imported into those two libraries during | |
| 538 // patching. | |
| 539 importHelperLibrary(coreLibrary); | |
| 540 importHelperLibrary(interceptorsLibrary); | |
| 541 | |
| 542 importForeignLibrary(jsHelperLibrary); | |
| 543 importForeignLibrary(interceptorsLibrary); | |
| 544 | |
| 545 importForeignLibrary(isolateHelperLibrary); | |
| 546 importHelperLibrary(isolateHelperLibrary); | |
| 547 | |
| 548 assertMethod = jsHelperLibrary.find(const SourceString('assertHelper')); | 553 assertMethod = jsHelperLibrary.find(const SourceString('assertHelper')); |
| 549 identicalFunction = coreLibrary.find(const SourceString('identical')); | 554 identicalFunction = coreLibrary.find(const SourceString('identical')); |
| 550 | 555 |
| 551 initializeSpecialClasses(); | 556 initializeSpecialClasses(); |
| 552 | 557 |
| 553 functionClass.ensureResolved(this); | 558 functionClass.ensureResolved(this); |
| 554 functionApplyMethod = | 559 functionApplyMethod = |
| 555 functionClass.lookupLocalMember(const SourceString('apply')); | 560 functionClass.lookupLocalMember(const SourceString('apply')); |
| 556 jsInvocationMirrorClass.ensureResolved(this); | 561 jsInvocationMirrorClass.ensureResolved(this); |
| 557 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember( | 562 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 570 libraryLoader.importLibrary(library, jsHelperLibrary, null); | 575 libraryLoader.importLibrary(library, jsHelperLibrary, null); |
| 571 } | 576 } |
| 572 } | 577 } |
| 573 | 578 |
| 574 /** | 579 /** |
| 575 * Get an [Uri] pointing to a patch for the dart: library with | 580 * Get an [Uri] pointing to a patch for the dart: library with |
| 576 * the given path. Returns null if there is no patch. | 581 * the given path. Returns null if there is no patch. |
| 577 */ | 582 */ |
| 578 Uri resolvePatchUri(String dartLibraryPath); | 583 Uri resolvePatchUri(String dartLibraryPath); |
| 579 | 584 |
| 580 /** Define the JS helper functions in the given library. */ | |
| 581 void importForeignLibrary(LibraryElement library) { | |
| 582 if (foreignLibrary != null) { | |
| 583 libraryLoader.importLibrary(library, foreignLibrary, null); | |
| 584 } | |
| 585 } | |
| 586 | |
| 587 void importIsolateHelperLibrary(LibraryElement library) { | |
| 588 if (isolateHelperLibrary != null) { | |
| 589 libraryLoader.importLibrary(library, isolateHelperLibrary, null); | |
| 590 } | |
| 591 } | |
| 592 | |
| 593 // TODO(karlklose,floitsch): move this to the javascript backend. | |
| 594 /** Enable the 'JS' helper for a library if needed. */ | |
| 595 void maybeEnableJSHelper(LibraryElement library) { | |
| 596 String libraryName = library.canonicalUri.toString(); | |
| 597 bool nativeTest = library.entryCompilationUnit.script.name.contains( | |
| 598 'dart/tests/compiler/dart2js_native'); | |
| 599 if (nativeTest | |
| 600 || libraryName == 'dart:async' | |
| 601 || libraryName == 'dart:chrome' | |
| 602 || libraryName == 'dart:mirrors' | |
| 603 || libraryName == 'dart:math' | |
| 604 || libraryName == 'dart:html' | |
| 605 || libraryName == 'dart:html_common' | |
| 606 || libraryName == 'dart:indexed_db' | |
| 607 || libraryName == 'dart:svg' | |
| 608 || libraryName == 'dart:web_audio') { | |
| 609 if (nativeTest | |
| 610 || libraryName == 'dart:chrome' | |
| 611 || libraryName == 'dart:html' | |
| 612 || libraryName == 'dart:html_common' | |
| 613 || libraryName == 'dart:indexed_db' | |
| 614 || libraryName == 'dart:svg') { | |
| 615 // dart:html and dart:svg need access to convertDartClosureToJS and | |
| 616 // annotation classes. | |
| 617 // dart:mirrors needs access to the Primitives class. | |
| 618 importHelperLibrary(library); | |
| 619 } | |
| 620 library.addToScope( | |
| 621 foreignLibrary.findLocal(const SourceString('JS')), this); | |
| 622 Element jsIndexingBehaviorInterface = | |
| 623 findHelper(const SourceString('JavaScriptIndexingBehavior')); | |
| 624 if (jsIndexingBehaviorInterface != null) { | |
| 625 library.addToScope(jsIndexingBehaviorInterface, this); | |
| 626 } | |
| 627 } | |
| 628 } | |
| 629 | |
| 630 void maybeEnableIsolateHelper(LibraryElement library) { | |
| 631 String libraryName = library.canonicalUri.toString(); | |
| 632 if (libraryName == 'dart:isolate' | |
| 633 || libraryName == 'dart:html' | |
| 634 // TODO(floitsch): create a separate async-helper library instead of | |
| 635 // importing the isolate-library just for TimerImpl. | |
| 636 || libraryName == 'dart:async') { | |
| 637 importIsolateHelperLibrary(library); | |
| 638 } | |
| 639 } | |
| 640 | |
| 641 void runCompiler(Uri uri) { | 585 void runCompiler(Uri uri) { |
| 642 assert(uri != null || analyzeOnly); | 586 assert(uri != null || analyzeOnly); |
| 643 scanBuiltinLibraries(); | 587 scanBuiltinLibraries(); |
| 644 if (librariesToAnalyzeWhenRun != null) { | 588 if (librariesToAnalyzeWhenRun != null) { |
| 645 for (Uri libraryUri in librariesToAnalyzeWhenRun) { | 589 for (Uri libraryUri in librariesToAnalyzeWhenRun) { |
| 646 log('analyzing $libraryUri ($BUILD_ID)'); | 590 log('analyzing $libraryUri ($BUILD_ID)'); |
| 647 libraryLoader.loadLibrary(libraryUri, null, libraryUri); | 591 libraryLoader.loadLibrary(libraryUri, null, libraryUri); |
| 648 } | 592 } |
| 649 } | 593 } |
| 650 if (uri != null) { | 594 if (uri != null) { |
| 651 if (analyzeOnly) { | 595 if (analyzeOnly) { |
| 652 log('analyzing $uri ($BUILD_ID)'); | 596 log('analyzing $uri ($BUILD_ID)'); |
| 653 } else { | 597 } else { |
| 654 log('compiling $uri ($BUILD_ID)'); | 598 log('compiling $uri ($BUILD_ID)'); |
| 655 } | 599 } |
| 656 mainApp = libraryLoader.loadLibrary(uri, null, uri); | 600 mainApp = libraryLoader.loadLibrary(uri, null, uri); |
| 657 } | 601 } |
| 658 libraries.forEach((_, library) { | |
| 659 maybeEnableJSHelper(library); | |
| 660 maybeEnableIsolateHelper(library); | |
| 661 }); | |
| 662 Element main = null; | 602 Element main = null; |
| 663 if (mainApp != null) { | 603 if (mainApp != null) { |
| 664 main = mainApp.find(MAIN); | 604 main = mainApp.find(MAIN); |
| 665 if (main == null) { | 605 if (main == null) { |
| 666 if (!analyzeOnly) { | 606 if (!analyzeOnly) { |
| 667 // Allow analyze only of libraries with no main. | 607 // Allow analyze only of libraries with no main. |
| 668 reportFatalError('Could not find $MAIN', mainApp); | 608 reportFatalError('Could not find $MAIN', mainApp); |
| 669 } else if (!analyzeAll) { | 609 } else if (!analyzeAll) { |
| 670 reportFatalError( | 610 reportFatalError( |
| 671 "Could not find $MAIN. " | 611 "Could not find $MAIN. " |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 // TODO(johnniwinther): Use [spannable] and [message] to provide better | 1080 // TODO(johnniwinther): Use [spannable] and [message] to provide better |
| 1141 // information on assertion errors. | 1081 // information on assertion errors. |
| 1142 if (condition is Function){ | 1082 if (condition is Function){ |
| 1143 condition = condition(); | 1083 condition = condition(); |
| 1144 } | 1084 } |
| 1145 if (spannable == null || !condition) { | 1085 if (spannable == null || !condition) { |
| 1146 throw new SpannableAssertionFailure(spannable, message); | 1086 throw new SpannableAssertionFailure(spannable, message); |
| 1147 } | 1087 } |
| 1148 return true; | 1088 return true; |
| 1149 } | 1089 } |
| OLD | NEW |