Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_backend/namer.dart

Issue 12334070: Support runtime check of function types. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Register dependency Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 * Assigns JavaScript identifiers to Dart variables, class-names and members. 8 * Assigns JavaScript identifiers to Dart variables, class-names and members.
9 */ 9 */
10 class Namer implements ClosureNamer { 10 class Namer implements ClosureNamer {
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 } 702 }
703 703
704 String isolateLazyInitializerAccess(Element element) { 704 String isolateLazyInitializerAccess(Element element) {
705 return "$CURRENT_ISOLATE.${getLazyInitializerName(element)}"; 705 return "$CURRENT_ISOLATE.${getLazyInitializerName(element)}";
706 } 706 }
707 707
708 String operatorIsPrefix() => r'$is'; 708 String operatorIsPrefix() => r'$is';
709 709
710 String operatorAsPrefix() => r'$as'; 710 String operatorAsPrefix() => r'$as';
711 711
712 String operatorSignature() => r'$signature';
713
714 Map<FunctionType,String> functionTypeNameMap = new Map<FunctionType,String>();
715 FunctionTypeNamer functionTypeNamer = new FunctionTypeNamer();
716
717 String getFunctionTypeName(FunctionType functionType) {
718 return functionTypeNameMap.putIfAbsent(functionType, () {
719 String proposedName = functionTypeNamer.computeName(functionType);
720 String freshName = getFreshName(proposedName, usedInstanceNames,
721 suggestedInstanceNames, ensureSafe: true);
722 return freshName;
723 });
724 }
725
726 String operatorIsFunctionType(FunctionType type) {
727 // TODO(erikcorry): Reduce from $isx to ix when we are minifying.
728 return '${operatorIsPrefix()}${getFunctionTypeName(type)}';
729 }
730
712 String operatorIs(Element element) { 731 String operatorIs(Element element) {
713 // TODO(erikcorry): Reduce from $isx to ix when we are minifying. 732 // TODO(erikcorry): Reduce from $isx to ix when we are minifying.
714 return '${operatorIsPrefix()}${getName(element)}'; 733 return '${operatorIsPrefix()}${getName(element)}';
715 } 734 }
716 735
717 /* 736 /*
718 * Returns a name that does not clash with reserved JS keywords, 737 * Returns a name that does not clash with reserved JS keywords,
719 * and also ensures it won't clash with other identifiers. 738 * and also ensures it won't clash with other identifiers.
720 */ 739 */
721 String _safeName(String name, Set<String> reserved) { 740 String _safeName(String name, Set<String> reserved) {
722 if (reserved.contains(name) || name.startsWith(r'$')) { 741 if (reserved.contains(name) || name.startsWith(r'$')) {
723 name = '\$$name'; 742 name = '\$$name';
724 } 743 }
725 assert(!reserved.contains(name)); 744 assert(!reserved.contains(name));
726 return name; 745 return name;
727 } 746 }
728 747
729 String substitutionName(Element element) { 748 String substitutionName(Element element) {
730 return '${operatorAsPrefix()}${getName(element)}'; 749 return '${operatorAsPrefix()}${getName(element)}';
731 } 750 }
732 751
752 String signatureName(FunctionType type) {
753 ClassElement classElement = Types.getClassContext(type);
754 String signature = '${operatorSignature()}_${getFunctionTypeName(type)}';
755 if (classElement != null) {
756 return '${isolateAccess(classElement)}.$signature';
757 } else {
758 return '${CURRENT_ISOLATE}.$signature';
759 }
760 }
761
733 String safeName(String name) => _safeName(name, jsReserved); 762 String safeName(String name) => _safeName(name, jsReserved);
734 String safeVariableName(String name) => _safeName(name, jsVariableReserved); 763 String safeVariableName(String name) => _safeName(name, jsVariableReserved);
735 764
736 SourceString operatorNameToIdentifier(SourceString name) { 765 SourceString operatorNameToIdentifier(SourceString name) {
737 if (name == null) return null; 766 if (name == null) return null;
738 String value = name.stringValue; 767 String value = name.stringValue;
739 if (value == null) { 768 if (value == null) {
740 return name; 769 return name;
741 } else if (value == '==') { 770 } else if (value == '==') {
742 return const SourceString(r'$eq'); 771 return const SourceString(r'$eq');
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 return const SourceString(r'$or'); 805 return const SourceString(r'$or');
777 } else if (value == '-') { 806 } else if (value == '-') {
778 return const SourceString(r'$sub'); 807 return const SourceString(r'$sub');
779 } else if (value == 'unary-') { 808 } else if (value == 'unary-') {
780 return const SourceString(r'$negate'); 809 return const SourceString(r'$negate');
781 } else { 810 } else {
782 return name; 811 return name;
783 } 812 }
784 } 813 }
785 } 814 }
815
816 class FunctionTypeNamer extends DartTypeVisitor {
817 StringBuffer sb;
818
819 String computeName(DartType type) {
820 sb = new StringBuffer();
821 visit(type);
822 return sb.toString();
823 }
824
825 visit(DartType type) {
826 type.accept(this, null);
827 }
828
829 visitType(DartType type, _) {
830 sb.write(type.name.slowToString());
831 }
832
833 visitFunctionType(FunctionType type, _) {
834 visit(type.returnType);
835 sb.write('_');
836 for (Link<DartType> link = type.parameterTypes;
837 !link.isEmpty;
838 link = link.tail) {
839 sb.write('_');
840 visit(link.head);
841 }
842 for (Link<DartType> link = type.optionalParameterTypes;
843 !link.isEmpty;
844 link = link.tail) {
845 sb.write('_');
846 visit(link.head);
847 }
848 if (!type.namedParameterTypes.isEmpty) {
849 for (Link<DartType> link = type.namedParameterTypes;
850 !link.isEmpty;
851 link = link.tail) {
852 sb.write('_');
853 visit(link.head);
854 }
855 }
856 }
857
858 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698