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 /** The one true [World]. */ | 5 /** The one true [World]. */ |
6 World world; | 6 World world; |
7 | 7 |
8 /** | 8 /** |
9 * Experimental phase to enable await, only set when using the | 9 * Experimental phase to enable await, only set when using the |
10 * await/awaitc.dart entrypoint. | 10 * await/awaitc.dart entrypoint. |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 avoidHazardousMemberNames(); | 513 avoidHazardousMemberNames(); |
514 } | 514 } |
515 | 515 |
516 makePrivateMembersUnique(Library rootLib) { | 516 makePrivateMembersUnique(Library rootLib) { |
517 var usedNames = new Set<String>(); | 517 var usedNames = new Set<String>(); |
518 process(lib) { | 518 process(lib) { |
519 for (var name in lib._privateMembers.getKeys()) { | 519 for (var name in lib._privateMembers.getKeys()) { |
520 if (usedNames.contains(name)) { | 520 if (usedNames.contains(name)) { |
521 var mset = lib._privateMembers[name]; | 521 var mset = lib._privateMembers[name]; |
522 String uniqueName = '_${lib.jsname}${mset.jsname}'; | 522 String uniqueName = '_${lib.jsname}${mset.jsname}'; |
523 mset.jsname = uniqueName; | |
524 for (var member in mset.members) { | 523 for (var member in mset.members) { |
525 member._jsname = uniqueName; | 524 member._jsname = uniqueName; |
526 } | 525 } |
527 } else { | 526 } else { |
528 usedNames.add(name); | 527 usedNames.add(name); |
529 } | 528 } |
530 } | 529 } |
531 } | 530 } |
532 | 531 |
533 // Visit libraries in pre-order of imports. | 532 // Visit libraries in pre-order of imports. |
534 var visited = new Set<Library>(); | 533 var visited = new Set<Library>(); |
535 visit(lib) { | 534 visit(lib) { |
536 if (visited.contains(lib)) return; | 535 if (visited.contains(lib)) return; |
537 visited.add(lib); | 536 visited.add(lib); |
538 process(lib); | 537 process(lib); |
539 for (var import in lib.imports) { | 538 for (var import in lib.imports) { |
540 visit(import.library); | 539 visit(import.library); |
541 } | 540 } |
542 } | 541 } |
543 visit(rootLib); | 542 visit(rootLib); |
544 } | 543 } |
545 | 544 |
546 /** | 545 /** |
547 * Ensures no non-native member has a jsname conflicting with a known native | 546 * Ensures no non-native member has a jsname conflicting with a known native |
548 * member jsname. | 547 * member jsname. |
549 */ | 548 */ |
550 avoidHazardousMemberNames() { | 549 avoidHazardousMemberNames() { |
551 rename(jsname) { | |
552 if (_hazardousMemberNames.contains(jsname)) { | |
553 jsname = '${jsname}\$_'; | |
554 } | |
555 return jsname; | |
556 } | |
557 | |
558 for (var name in _members.getKeys()) { | 550 for (var name in _members.getKeys()) { |
559 var mset = _members[name]; | 551 var mset = _members[name]; |
560 bool renamed = false; | |
561 for (var member in mset.members) { | 552 for (var member in mset.members) { |
562 if (!member.isNative || | 553 if (!member.isNative || |
563 (member is MethodMember && member.hasNativeBody)) { | 554 (member is MethodMember && member.hasNativeBody)) { |
564 String oldName = member._jsname; | 555 var jsname = member._jsname; |
565 member._jsname = rename(oldName); | 556 if (_hazardousMemberNames.contains(jsname)) { |
566 if (member._jsname != oldName) renamed = true; | 557 member._jsnameRoot = jsname; |
| 558 member._jsname = '${jsname}\$_'; |
| 559 } |
567 } | 560 } |
568 } | 561 } |
569 // If any of the members where renamed, rename mset. | |
570 // | |
571 // If all members were renamed this makes mset.jsname consistent. If none | |
572 // were renamed that means they are native methods (with names different | |
573 // to the Dart names), so the mset name should not be renamed to stay | |
574 // consistent. If only some were renamed then the mset has no consistent | |
575 // calling convention, and will dispatch via a stub, so the mset name is | |
576 // irrelevant. | |
577 if (renamed) { | |
578 mset.jsname = rename(mset.jsname); | |
579 } | |
580 } | 562 } |
581 } | 563 } |
582 | 564 |
583 findMainMethod(Library lib) { | 565 findMainMethod(Library lib) { |
584 var main = lib.lookup('main', lib.span); | 566 var main = lib.lookup('main', lib.span); |
585 if (main == null) { | 567 if (main == null) { |
586 if (!options.checkOnly) fatal('no main method specified'); | 568 if (!options.checkOnly) fatal('no main method specified'); |
587 } | 569 } |
588 return main; | 570 return main; |
589 } | 571 } |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 | 702 |
721 withTiming(String name, f()) { | 703 withTiming(String name, f()) { |
722 final sw = new Stopwatch(); | 704 final sw = new Stopwatch(); |
723 sw.start(); | 705 sw.start(); |
724 var result = f(); | 706 var result = f(); |
725 sw.stop(); | 707 sw.stop(); |
726 info('$name in ${sw.elapsedInMs()}msec'); | 708 info('$name in ${sw.elapsedInMs()}msec'); |
727 return result; | 709 return result; |
728 } | 710 } |
729 } | 711 } |
OLD | NEW |