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 js_backend; | 5 part of js_backend; |
6 | 6 |
7 /** | 7 /** |
8 * A function element that represents a closure call. The signature is copied | 8 * A function element that represents a closure call. The signature is copied |
9 * from the given element. | 9 * from the given element. |
10 */ | 10 */ |
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 bool needsGetter, | 724 bool needsGetter, |
725 bool needsSetter, | 725 bool needsSetter, |
726 bool needsCheckedSetter)) { | 726 bool needsCheckedSetter)) { |
727 assert(invariant(classElement, classElement.isDeclaration)); | 727 assert(invariant(classElement, classElement.isDeclaration)); |
728 // If the class is never instantiated we still need to set it up for | 728 // If the class is never instantiated we still need to set it up for |
729 // inheritance purposes, but we can simplify its JavaScript constructor. | 729 // inheritance purposes, but we can simplify its JavaScript constructor. |
730 bool isInstantiated = | 730 bool isInstantiated = |
731 compiler.codegenWorld.instantiatedClasses.contains(classElement); | 731 compiler.codegenWorld.instantiatedClasses.contains(classElement); |
732 | 732 |
733 void visitField(ClassElement enclosingClass, Element member) { | 733 void visitField(ClassElement enclosingClass, Element member) { |
| 734 assert(!member.isNative()); |
734 assert(invariant(classElement, member.isDeclaration)); | 735 assert(invariant(classElement, member.isDeclaration)); |
735 | 736 |
736 LibraryElement library = member.getLibrary(); | 737 LibraryElement library = member.getLibrary(); |
737 SourceString name = member.name; | 738 SourceString name = member.name; |
738 bool isPrivate = name.isPrivate(); | 739 bool isPrivate = name.isPrivate(); |
739 // See if we can dynamically create getters and setters. | 740 // See if we can dynamically create getters and setters. |
740 // We can only generate getters and setters for [classElement] since | 741 // We can only generate getters and setters for [classElement] since |
741 // the fields of super classes could be overwritten with getters or | 742 // the fields of super classes could be overwritten with getters or |
742 // setters. | 743 // setters. |
743 bool needsGetter = false; | 744 bool needsGetter = false; |
744 bool needsSetter = false; | 745 bool needsSetter = false; |
745 // We need to name shadowed fields differently, so they don't clash with | 746 // We need to name shadowed fields differently, so they don't clash with |
746 // the non-shadowed field. | 747 // the non-shadowed field. |
747 bool isShadowed = false; | 748 bool isShadowed = false; |
748 if (identical(enclosingClass, classElement)) { | 749 if (identical(enclosingClass, classElement)) { |
749 needsGetter = instanceFieldNeedsGetter(member); | 750 needsGetter = instanceFieldNeedsGetter(member); |
750 needsSetter = instanceFieldNeedsSetter(member); | 751 needsSetter = instanceFieldNeedsSetter(member); |
751 } else { | 752 } else { |
752 isShadowed = classElement.isShadowedByField(member); | 753 isShadowed = classElement.isShadowedByField(member); |
753 } | 754 } |
754 | 755 |
755 if ((isInstantiated && !enclosingClass.isNative()) | 756 if ((isInstantiated && !enclosingClass.isNative()) |
756 || needsGetter | 757 || needsGetter |
757 || needsSetter) { | 758 || needsSetter) { |
758 String accessorName = isShadowed | 759 String fieldName = isShadowed |
759 ? namer.shadowedFieldName(member) | 760 ? namer.shadowedFieldName(member) |
760 : namer.getName(member); | 761 : namer.getName(member); |
761 String fieldName = member.isNative() | |
762 ? member.nativeName() | |
763 : accessorName; | |
764 bool needsCheckedSetter = false; | 762 bool needsCheckedSetter = false; |
765 if (needsSetter && compiler.enableTypeAssertions | 763 if (needsSetter && compiler.enableTypeAssertions |
766 && canGenerateCheckedSetter(member)) { | 764 && canGenerateCheckedSetter(member)) { |
767 needsCheckedSetter = true; | 765 needsCheckedSetter = true; |
768 needsSetter = false; | 766 needsSetter = false; |
769 } | 767 } |
770 // Getters and setters with suffixes will be generated dynamically. | 768 // Getters and setters with suffixes will be generated dynamically. |
771 addField(member, | 769 addField(member, |
772 fieldName, | 770 fieldName, |
773 needsGetter, | 771 needsGetter, |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1248 */ | 1246 */ |
1249 void emitCallStubForGetter(Element member, | 1247 void emitCallStubForGetter(Element member, |
1250 Set<Selector> selectors, | 1248 Set<Selector> selectors, |
1251 DefineMemberFunction defineInstanceMember) { | 1249 DefineMemberFunction defineInstanceMember) { |
1252 assert(invariant(member, member.isDeclaration)); | 1250 assert(invariant(member, member.isDeclaration)); |
1253 LibraryElement memberLibrary = member.getLibrary(); | 1251 LibraryElement memberLibrary = member.getLibrary(); |
1254 String getter; | 1252 String getter; |
1255 if (member.isGetter()) { | 1253 if (member.isGetter()) { |
1256 getter = "this.${namer.getterName(member.getLibrary(), member.name)}()"; | 1254 getter = "this.${namer.getterName(member.getLibrary(), member.name)}()"; |
1257 } else { | 1255 } else { |
1258 String name = member.isNative() | 1256 String name = namer.instanceFieldName(memberLibrary, member.name); |
1259 ? member.nativeName() | |
1260 : namer.instanceFieldName(memberLibrary, member.name); | |
1261 getter = "this.$name"; | 1257 getter = "this.$name"; |
1262 } | 1258 } |
1263 for (Selector selector in selectors) { | 1259 for (Selector selector in selectors) { |
1264 if (selector.applies(member, compiler)) { | 1260 if (selector.applies(member, compiler)) { |
1265 String invocationName = | 1261 String invocationName = |
1266 namer.instanceMethodInvocationName(memberLibrary, member.name, | 1262 namer.instanceMethodInvocationName(memberLibrary, member.name, |
1267 selector); | 1263 selector); |
1268 SourceString callName = Namer.CLOSURE_INVOCATION_NAME; | 1264 SourceString callName = Namer.CLOSURE_INVOCATION_NAME; |
1269 String closureCallName = | 1265 String closureCallName = |
1270 namer.instanceMethodInvocationName(memberLibrary, callName, | 1266 namer.instanceMethodInvocationName(memberLibrary, callName, |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1779 const String HOOKS_API_USAGE = """ | 1775 const String HOOKS_API_USAGE = """ |
1780 // Generated by dart2js, the Dart to JavaScript compiler. | 1776 // Generated by dart2js, the Dart to JavaScript compiler. |
1781 // The code supports the following hooks: | 1777 // The code supports the following hooks: |
1782 // dartPrint(message) - if this function is defined it is called | 1778 // dartPrint(message) - if this function is defined it is called |
1783 // instead of the Dart [print] method. | 1779 // instead of the Dart [print] method. |
1784 // dartMainRunner(main) - if this function is defined, the Dart [main] | 1780 // dartMainRunner(main) - if this function is defined, the Dart [main] |
1785 // method will not be invoked directly. | 1781 // method will not be invoked directly. |
1786 // Instead, a closure that will invoke [main] is | 1782 // Instead, a closure that will invoke [main] is |
1787 // passed to [dartMainRunner]. | 1783 // passed to [dartMainRunner]. |
1788 """; | 1784 """; |
OLD | NEW |