OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 (function(global, utils) { | 5 (function(global, utils) { |
6 | 6 |
7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
8 | 8 |
9 // ------------------------------------------------------------------- | 9 // ------------------------------------------------------------------- |
10 // Imports | 10 // Imports |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 var result = %_StringCharCodeAt(this, pos); | 74 var result = %_StringCharCodeAt(this, pos); |
75 if (!%_IsSmi(result)) { | 75 if (!%_IsSmi(result)) { |
76 result = %_StringCharCodeAt(TO_STRING(this), TO_INTEGER(pos)); | 76 result = %_StringCharCodeAt(TO_STRING(this), TO_INTEGER(pos)); |
77 } | 77 } |
78 return result; | 78 return result; |
79 } | 79 } |
80 | 80 |
81 | 81 |
82 // ECMA-262, section 15.5.4.6 | 82 // ECMA-262, section 15.5.4.6 |
83 function StringConcat(other /* and more */) { // length == 1 | 83 function StringConcat(other /* and more */) { // length == 1 |
84 "use strict"; | |
84 CHECK_OBJECT_COERCIBLE(this, "String.prototype.concat"); | 85 CHECK_OBJECT_COERCIBLE(this, "String.prototype.concat"); |
85 var len = %_ArgumentsLength(); | 86 var s = TO_STRING(this); |
86 var this_as_string = TO_STRING(this); | 87 var len = arguments.length; |
87 if (len === 1) { | 88 for (var i = 0; i < len; ++i) { |
88 return this_as_string + TO_STRING(other); | 89 s = s + TO_STRING(arguments[i]); |
89 } | 90 } |
90 var parts = new InternalArray(len + 1); | 91 return s; |
91 parts[0] = this_as_string; | |
92 for (var i = 0; i < len; i++) { | |
93 var part = %_Arguments(i); | |
94 parts[i + 1] = TO_STRING(part); | |
95 } | |
96 return %StringBuilderConcat(parts, len + 1, ""); | |
97 } | 92 } |
98 | 93 |
99 | 94 |
100 // ECMA-262 section 15.5.4.7 | 95 // ECMA-262 section 15.5.4.7 |
101 function StringIndexOfJS(pattern /* position */) { // length == 1 | 96 function StringIndexOf(pattern, position) { // length == 1 |
102 CHECK_OBJECT_COERCIBLE(this, "String.prototype.indexOf"); | 97 CHECK_OBJECT_COERCIBLE(this, "String.prototype.indexOf"); |
103 | 98 |
104 var subject = TO_STRING(this); | 99 var subject = TO_STRING(this); |
105 pattern = TO_STRING(pattern); | 100 pattern = TO_STRING(pattern); |
106 var index = 0; | 101 var index = TO_INTEGER(position); |
107 if (%_ArgumentsLength() > 1) { | 102 if (index < 0) index = 0; |
108 index = %_Arguments(1); // position | 103 if (index > subject.length) index = subject.length; |
109 index = TO_INTEGER(index); | |
110 if (index < 0) index = 0; | |
111 if (index > subject.length) index = subject.length; | |
112 } | |
113 return %StringIndexOf(subject, pattern, index); | 104 return %StringIndexOf(subject, pattern, index); |
114 } | 105 } |
115 | 106 |
107 %FunctionSetLength(StringIndexOf, 1); | |
108 | |
116 | 109 |
117 // ECMA-262 section 15.5.4.8 | 110 // ECMA-262 section 15.5.4.8 |
118 function StringLastIndexOfJS(pat /* position */) { // length == 1 | 111 function StringLastIndexOfJS(pat /* position */) { // length == 1 |
112 "use strict"; | |
119 CHECK_OBJECT_COERCIBLE(this, "String.prototype.lastIndexOf"); | 113 CHECK_OBJECT_COERCIBLE(this, "String.prototype.lastIndexOf"); |
120 | 114 |
121 var sub = TO_STRING(this); | 115 var sub = TO_STRING(this); |
122 var subLength = sub.length; | 116 var subLength = sub.length; |
123 var pat = TO_STRING(pat); | 117 var pat = TO_STRING(pat); |
124 var patLength = pat.length; | 118 var patLength = pat.length; |
125 var index = subLength - patLength; | 119 var index = subLength - patLength; |
126 if (%_ArgumentsLength() > 1) { | 120 if (arguments.length > 1) { |
Yang
2016/02/12 09:25:39
why not do the same thing as for StringIndexOf?
Benedikt Meurer
2016/02/12 09:30:14
Done.
| |
127 var position = TO_NUMBER(%_Arguments(1)); | 121 var position = TO_NUMBER(arguments[1]); |
128 if (!NUMBER_IS_NAN(position)) { | 122 if (!NUMBER_IS_NAN(position)) { |
129 position = TO_INTEGER(position); | 123 position = TO_INTEGER(position); |
130 if (position < 0) { | 124 if (position < 0) { |
131 position = 0; | 125 position = 0; |
132 } | 126 } |
133 if (position + patLength < subLength) { | 127 if (position + patLength < subLength) { |
134 index = position; | 128 index = position; |
135 } | 129 } |
136 } | 130 } |
137 } | 131 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 return RegExpExecNoTests(regexp, subject, 0); | 165 return RegExpExecNoTests(regexp, subject, 0); |
172 } | 166 } |
173 | 167 |
174 | 168 |
175 // ECMA-262 v6, section 21.1.3.12 | 169 // ECMA-262 v6, section 21.1.3.12 |
176 // | 170 // |
177 // For now we do nothing, as proper normalization requires big tables. | 171 // For now we do nothing, as proper normalization requires big tables. |
178 // If Intl is enabled, then i18n.js will override it and provide the the | 172 // If Intl is enabled, then i18n.js will override it and provide the the |
179 // proper functionality. | 173 // proper functionality. |
180 function StringNormalizeJS() { | 174 function StringNormalizeJS() { |
175 "use strict"; | |
181 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 176 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
182 var s = TO_STRING(this); | 177 var s = TO_STRING(this); |
183 | 178 |
184 var formArg = %_Arguments(0); | 179 var formArg = arguments[0]; |
Yang
2016/02/12 09:25:39
I also prefer SetFunctionLength for this as well.
Benedikt Meurer
2016/02/12 09:30:14
Done.
| |
185 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); | 180 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); |
186 | 181 |
187 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; | 182 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; |
188 var normalizationForm = %_Call(ArrayIndexOf, NORMALIZATION_FORMS, form); | 183 var normalizationForm = %_Call(ArrayIndexOf, NORMALIZATION_FORMS, form); |
189 if (normalizationForm === -1) { | 184 if (normalizationForm === -1) { |
190 throw MakeRangeError(kNormalizationForm, | 185 throw MakeRangeError(kNormalizationForm, |
191 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); | 186 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); |
192 } | 187 } |
193 | 188 |
194 return s; | 189 return s; |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
560 function StringTrimRight() { | 555 function StringTrimRight() { |
561 CHECK_OBJECT_COERCIBLE(this, "String.prototype.trimRight"); | 556 CHECK_OBJECT_COERCIBLE(this, "String.prototype.trimRight"); |
562 | 557 |
563 return %StringTrim(TO_STRING(this), false, true); | 558 return %StringTrim(TO_STRING(this), false, true); |
564 } | 559 } |
565 | 560 |
566 | 561 |
567 // ECMA-262, section 15.5.3.2 | 562 // ECMA-262, section 15.5.3.2 |
568 function StringFromCharCode(code) { | 563 function StringFromCharCode(code) { |
569 var n = %_ArgumentsLength(); | 564 var n = %_ArgumentsLength(); |
570 if (n == 1) return %_StringCharFromCode(code & 0xffff); | 565 if (n === 1) return %_StringCharFromCode(code & 0xffff); |
571 | 566 |
572 var one_byte = %NewString(n, NEW_ONE_BYTE_STRING); | 567 var one_byte = %NewString(n, NEW_ONE_BYTE_STRING); |
573 var i; | 568 var i; |
574 for (i = 0; i < n; i++) { | 569 for (i = 0; i < n; i++) { |
575 code = %_Arguments(i) & 0xffff; | 570 code = %_Arguments(i) & 0xffff; |
576 if (code > 0xff) break; | 571 if (code > 0xff) break; |
577 %_OneByteSeqStringSetChar(i, code, one_byte); | 572 %_OneByteSeqStringSetChar(i, code, one_byte); |
578 } | 573 } |
579 if (i == n) return one_byte; | 574 if (i == n) return one_byte; |
580 one_byte = %TruncateString(one_byte, i); | 575 one_byte = %TruncateString(one_byte, i); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 while (true) { | 704 while (true) { |
710 if (n & 1) r += s; | 705 if (n & 1) r += s; |
711 n >>= 1; | 706 n >>= 1; |
712 if (n === 0) return r; | 707 if (n === 0) return r; |
713 s += s; | 708 s += s; |
714 } | 709 } |
715 } | 710 } |
716 | 711 |
717 | 712 |
718 // ES6 draft 04-05-14, section 21.1.3.18 | 713 // ES6 draft 04-05-14, section 21.1.3.18 |
719 function StringStartsWith(searchString /* position */) { // length == 1 | 714 function StringStartsWith(searchString, position) { // length == 1 |
720 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); | 715 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); |
721 | 716 |
722 var s = TO_STRING(this); | 717 var s = TO_STRING(this); |
723 | 718 |
724 if (IS_REGEXP(searchString)) { | 719 if (IS_REGEXP(searchString)) { |
725 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.startsWith"); | 720 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.startsWith"); |
726 } | 721 } |
727 | 722 |
728 var ss = TO_STRING(searchString); | 723 var ss = TO_STRING(searchString); |
729 var pos = 0; | 724 var pos = TO_INTEGER(position); |
730 if (%_ArgumentsLength() > 1) { | |
731 var arg = %_Arguments(1); // position | |
732 if (!IS_UNDEFINED(arg)) { | |
733 pos = TO_INTEGER(arg); | |
734 } | |
735 } | |
736 | 725 |
737 var s_len = s.length; | 726 var s_len = s.length; |
738 var start = MinSimple(MaxSimple(pos, 0), s_len); | 727 var start = MinSimple(MaxSimple(pos, 0), s_len); |
739 var ss_len = ss.length; | 728 var ss_len = ss.length; |
740 if (ss_len + start > s_len) { | 729 if (ss_len + start > s_len) { |
741 return false; | 730 return false; |
742 } | 731 } |
743 | 732 |
744 return %_SubString(s, start, start + ss_len) === ss; | 733 return %_SubString(s, start, start + ss_len) === ss; |
745 } | 734 } |
746 | 735 |
736 %FunctionSetLength(StringStartsWith, 1); | |
737 | |
747 | 738 |
748 // ES6 draft 04-05-14, section 21.1.3.7 | 739 // ES6 draft 04-05-14, section 21.1.3.7 |
749 function StringEndsWith(searchString /* position */) { // length == 1 | 740 function StringEndsWith(searchString, position) { // length == 1 |
750 CHECK_OBJECT_COERCIBLE(this, "String.prototype.endsWith"); | 741 CHECK_OBJECT_COERCIBLE(this, "String.prototype.endsWith"); |
751 | 742 |
752 var s = TO_STRING(this); | 743 var s = TO_STRING(this); |
753 | 744 |
754 if (IS_REGEXP(searchString)) { | 745 if (IS_REGEXP(searchString)) { |
755 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.endsWith"); | 746 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.endsWith"); |
756 } | 747 } |
757 | 748 |
758 var ss = TO_STRING(searchString); | 749 var ss = TO_STRING(searchString); |
759 var s_len = s.length; | 750 var s_len = s.length; |
760 var pos = s_len; | 751 var pos = !IS_UNDEFINED(position) ? TO_INTEGER(position) : s_len |
761 if (%_ArgumentsLength() > 1) { | |
762 var arg = %_Arguments(1); // position | |
763 if (!IS_UNDEFINED(arg)) { | |
764 pos = TO_INTEGER(arg); | |
765 } | |
766 } | |
767 | 752 |
768 var end = MinSimple(MaxSimple(pos, 0), s_len); | 753 var end = MinSimple(MaxSimple(pos, 0), s_len); |
769 var ss_len = ss.length; | 754 var ss_len = ss.length; |
770 var start = end - ss_len; | 755 var start = end - ss_len; |
771 if (start < 0) { | 756 if (start < 0) { |
772 return false; | 757 return false; |
773 } | 758 } |
774 | 759 |
775 return %_SubString(s, start, start + ss_len) === ss; | 760 return %_SubString(s, start, start + ss_len) === ss; |
776 } | 761 } |
777 | 762 |
763 %FunctionSetLength(StringEndsWith, 1); | |
764 | |
778 | 765 |
779 // ES6 draft 04-05-14, section 21.1.3.6 | 766 // ES6 draft 04-05-14, section 21.1.3.6 |
780 function StringIncludes(searchString /* position */) { // length == 1 | 767 function StringIncludes(searchString, position) { // length == 1 |
781 CHECK_OBJECT_COERCIBLE(this, "String.prototype.includes"); | 768 CHECK_OBJECT_COERCIBLE(this, "String.prototype.includes"); |
782 | 769 |
783 var string = TO_STRING(this); | 770 var string = TO_STRING(this); |
784 | 771 |
785 if (IS_REGEXP(searchString)) { | 772 if (IS_REGEXP(searchString)) { |
786 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.includes"); | 773 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.includes"); |
787 } | 774 } |
788 | 775 |
789 searchString = TO_STRING(searchString); | 776 searchString = TO_STRING(searchString); |
790 var pos = 0; | 777 var pos = TO_INTEGER(position); |
791 if (%_ArgumentsLength() > 1) { | |
792 pos = %_Arguments(1); // position | |
793 pos = TO_INTEGER(pos); | |
794 } | |
795 | 778 |
796 var stringLength = string.length; | 779 var stringLength = string.length; |
797 if (pos < 0) pos = 0; | 780 if (pos < 0) pos = 0; |
798 if (pos > stringLength) pos = stringLength; | 781 if (pos > stringLength) pos = stringLength; |
799 var searchStringLength = searchString.length; | 782 var searchStringLength = searchString.length; |
800 | 783 |
801 if (searchStringLength + pos > stringLength) { | 784 if (searchStringLength + pos > stringLength) { |
802 return false; | 785 return false; |
803 } | 786 } |
804 | 787 |
805 return %StringIndexOf(string, searchString, pos) !== -1; | 788 return %StringIndexOf(string, searchString, pos) !== -1; |
806 } | 789 } |
807 | 790 |
791 %FunctionSetLength(StringIncludes, 1); | |
792 | |
808 | 793 |
809 // ES6 Draft 05-22-2014, section 21.1.3.3 | 794 // ES6 Draft 05-22-2014, section 21.1.3.3 |
810 function StringCodePointAt(pos) { | 795 function StringCodePointAt(pos) { |
811 CHECK_OBJECT_COERCIBLE(this, "String.prototype.codePointAt"); | 796 CHECK_OBJECT_COERCIBLE(this, "String.prototype.codePointAt"); |
812 | 797 |
813 var string = TO_STRING(this); | 798 var string = TO_STRING(this); |
814 var size = string.length; | 799 var size = string.length; |
815 pos = TO_INTEGER(pos); | 800 pos = TO_INTEGER(pos); |
816 if (pos < 0 || pos >= size) { | 801 if (pos < 0 || pos >= size) { |
817 return UNDEFINED; | 802 return UNDEFINED; |
818 } | 803 } |
819 var first = %_StringCharCodeAt(string, pos); | 804 var first = %_StringCharCodeAt(string, pos); |
820 if (first < 0xD800 || first > 0xDBFF || pos + 1 == size) { | 805 if (first < 0xD800 || first > 0xDBFF || pos + 1 == size) { |
821 return first; | 806 return first; |
822 } | 807 } |
823 var second = %_StringCharCodeAt(string, pos + 1); | 808 var second = %_StringCharCodeAt(string, pos + 1); |
824 if (second < 0xDC00 || second > 0xDFFF) { | 809 if (second < 0xDC00 || second > 0xDFFF) { |
825 return first; | 810 return first; |
826 } | 811 } |
827 return (first - 0xD800) * 0x400 + second + 0x2400; | 812 return (first - 0xD800) * 0x400 + second + 0x2400; |
828 } | 813 } |
829 | 814 |
830 | 815 |
831 // ES6 Draft 05-22-2014, section 21.1.2.2 | 816 // ES6 Draft 05-22-2014, section 21.1.2.2 |
832 function StringFromCodePoint(_) { // length = 1 | 817 function StringFromCodePoint(_) { // length = 1 |
818 "use strict"; | |
833 var code; | 819 var code; |
834 var length = %_ArgumentsLength(); | 820 var length = arguments.length; |
835 var index; | 821 var index; |
836 var result = ""; | 822 var result = ""; |
837 for (index = 0; index < length; index++) { | 823 for (index = 0; index < length; index++) { |
838 code = %_Arguments(index); | 824 code = arguments[index]; |
839 if (!%_IsSmi(code)) { | 825 if (!%_IsSmi(code)) { |
840 code = TO_NUMBER(code); | 826 code = TO_NUMBER(code); |
841 } | 827 } |
842 if (code < 0 || code > 0x10FFFF || code !== TO_INTEGER(code)) { | 828 if (code < 0 || code > 0x10FFFF || code !== TO_INTEGER(code)) { |
843 throw MakeRangeError(kInvalidCodePoint, code); | 829 throw MakeRangeError(kInvalidCodePoint, code); |
844 } | 830 } |
845 if (code <= 0xFFFF) { | 831 if (code <= 0xFFFF) { |
846 result += %_StringCharFromCode(code); | 832 result += %_StringCharFromCode(code); |
847 } else { | 833 } else { |
848 code -= 0x10000; | 834 code -= 0x10000; |
849 result += %_StringCharFromCode((code >>> 10) & 0x3FF | 0xD800); | 835 result += %_StringCharFromCode((code >>> 10) & 0x3FF | 0xD800); |
850 result += %_StringCharFromCode(code & 0x3FF | 0xDC00); | 836 result += %_StringCharFromCode(code & 0x3FF | 0xDC00); |
851 } | 837 } |
852 } | 838 } |
853 return result; | 839 return result; |
854 } | 840 } |
855 | 841 |
856 | 842 |
857 // ------------------------------------------------------------------- | 843 // ------------------------------------------------------------------- |
858 // String methods related to templates | 844 // String methods related to templates |
859 | 845 |
860 // ES6 Draft 03-17-2015, section 21.1.2.4 | 846 // ES6 Draft 03-17-2015, section 21.1.2.4 |
861 function StringRaw(callSite) { | 847 function StringRaw(callSite) { |
862 // TODO(caitp): Use rest parameters when implemented | 848 "use strict"; |
863 var numberOfSubstitutions = %_ArgumentsLength(); | 849 var numberOfSubstitutions = arguments.length; |
864 var cooked = TO_OBJECT(callSite); | 850 var cooked = TO_OBJECT(callSite); |
865 var raw = TO_OBJECT(cooked.raw); | 851 var raw = TO_OBJECT(cooked.raw); |
866 var literalSegments = TO_LENGTH(raw.length); | 852 var literalSegments = TO_LENGTH(raw.length); |
867 if (literalSegments <= 0) return ""; | 853 if (literalSegments <= 0) return ""; |
868 | 854 |
869 var result = TO_STRING(raw[0]); | 855 var result = TO_STRING(raw[0]); |
870 | 856 |
871 for (var i = 1; i < literalSegments; ++i) { | 857 for (var i = 1; i < literalSegments; ++i) { |
872 if (i < numberOfSubstitutions) { | 858 if (i < numberOfSubstitutions) { |
873 result += TO_STRING(%_Arguments(i)); | 859 result += TO_STRING(arguments[i]); |
874 } | 860 } |
875 result += TO_STRING(raw[i]); | 861 result += TO_STRING(raw[i]); |
876 } | 862 } |
877 | 863 |
878 return result; | 864 return result; |
879 } | 865 } |
880 | 866 |
881 // ------------------------------------------------------------------- | 867 // ------------------------------------------------------------------- |
882 | 868 |
883 // Set the String function and constructor. | 869 // Set the String function and constructor. |
(...skipping 13 matching lines...) Expand all Loading... | |
897 // Set up the non-enumerable functions on the String prototype object. | 883 // Set up the non-enumerable functions on the String prototype object. |
898 utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ | 884 utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ |
899 "valueOf", StringValueOf, | 885 "valueOf", StringValueOf, |
900 "toString", StringToString, | 886 "toString", StringToString, |
901 "charAt", StringCharAtJS, | 887 "charAt", StringCharAtJS, |
902 "charCodeAt", StringCharCodeAtJS, | 888 "charCodeAt", StringCharCodeAtJS, |
903 "codePointAt", StringCodePointAt, | 889 "codePointAt", StringCodePointAt, |
904 "concat", StringConcat, | 890 "concat", StringConcat, |
905 "endsWith", StringEndsWith, | 891 "endsWith", StringEndsWith, |
906 "includes", StringIncludes, | 892 "includes", StringIncludes, |
907 "indexOf", StringIndexOfJS, | 893 "indexOf", StringIndexOf, |
908 "lastIndexOf", StringLastIndexOfJS, | 894 "lastIndexOf", StringLastIndexOfJS, |
909 "localeCompare", StringLocaleCompareJS, | 895 "localeCompare", StringLocaleCompareJS, |
910 "match", StringMatchJS, | 896 "match", StringMatchJS, |
911 "normalize", StringNormalizeJS, | 897 "normalize", StringNormalizeJS, |
912 "repeat", StringRepeat, | 898 "repeat", StringRepeat, |
913 "replace", StringReplace, | 899 "replace", StringReplace, |
914 "search", StringSearch, | 900 "search", StringSearch, |
915 "slice", StringSlice, | 901 "slice", StringSlice, |
916 "split", StringSplitJS, | 902 "split", StringSplitJS, |
917 "substring", StringSubstring, | 903 "substring", StringSubstring, |
(...skipping 21 matching lines...) Expand all Loading... | |
939 "sub", StringSub, | 925 "sub", StringSub, |
940 "sup", StringSup | 926 "sup", StringSup |
941 ]); | 927 ]); |
942 | 928 |
943 // ------------------------------------------------------------------- | 929 // ------------------------------------------------------------------- |
944 // Exports | 930 // Exports |
945 | 931 |
946 utils.Export(function(to) { | 932 utils.Export(function(to) { |
947 to.ExpandReplacement = ExpandReplacement; | 933 to.ExpandReplacement = ExpandReplacement; |
948 to.StringCharAt = StringCharAtJS; | 934 to.StringCharAt = StringCharAtJS; |
949 to.StringIndexOf = StringIndexOfJS; | 935 to.StringIndexOf = StringIndexOf; |
950 to.StringLastIndexOf = StringLastIndexOfJS; | 936 to.StringLastIndexOf = StringLastIndexOfJS; |
951 to.StringMatch = StringMatchJS; | 937 to.StringMatch = StringMatchJS; |
952 to.StringReplace = StringReplace; | 938 to.StringReplace = StringReplace; |
953 to.StringSlice = StringSlice; | 939 to.StringSlice = StringSlice; |
954 to.StringSplit = StringSplitJS; | 940 to.StringSplit = StringSplitJS; |
955 to.StringSubstr = StringSubstr; | 941 to.StringSubstr = StringSubstr; |
956 to.StringSubstring = StringSubstring; | 942 to.StringSubstring = StringSubstring; |
957 }); | 943 }); |
958 | 944 |
959 }) | 945 }) |
OLD | NEW |