| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 // ECMAScript 402 API implementation. | 5 // ECMAScript 402 API implementation. |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Intl object is a single object that has some named properties, | 8 * Intl object is a single object that has some named properties, |
| 9 * all of which are constructors. | 9 * all of which are constructors. |
| 10 */ | 10 */ |
| 11 (function(global, utils) { | 11 (function(global, utils) { |
| 12 | 12 |
| 13 "use strict"; | 13 "use strict"; |
| 14 | 14 |
| 15 %CheckIsBootstrapping(); | 15 %CheckIsBootstrapping(); |
| 16 | 16 |
| 17 // ------------------------------------------------------------------- | 17 // ------------------------------------------------------------------- |
| 18 // Imports | 18 // Imports |
| 19 | 19 |
| 20 var ArrayIndexOf; | |
| 21 var ArrayJoin; | 20 var ArrayJoin; |
| 22 var ArrayPush; | 21 var ArrayPush; |
| 23 var FLAG_intl_extra; | 22 var FLAG_intl_extra; |
| 24 var GlobalDate = global.Date; | 23 var GlobalDate = global.Date; |
| 25 var GlobalNumber = global.Number; | 24 var GlobalNumber = global.Number; |
| 26 var GlobalRegExp = global.RegExp; | 25 var GlobalRegExp = global.RegExp; |
| 27 var GlobalString = global.String; | 26 var GlobalString = global.String; |
| 28 var InstallFunctions = utils.InstallFunctions; | 27 var InstallFunctions = utils.InstallFunctions; |
| 29 var InstallGetter = utils.InstallGetter; | 28 var InstallGetter = utils.InstallGetter; |
| 30 var InternalArray = utils.InternalArray; | 29 var InternalArray = utils.InternalArray; |
| 31 var InternalRegExpMatch; | 30 var InternalRegExpMatch; |
| 32 var InternalRegExpReplace | 31 var InternalRegExpReplace |
| 33 var IsNaN; | 32 var IsNaN; |
| 34 var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty"); | 33 var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty"); |
| 35 var OverrideFunction = utils.OverrideFunction; | 34 var OverrideFunction = utils.OverrideFunction; |
| 36 var patternSymbol = utils.ImportNow("intl_pattern_symbol"); | 35 var patternSymbol = utils.ImportNow("intl_pattern_symbol"); |
| 37 var resolvedSymbol = utils.ImportNow("intl_resolved_symbol"); | 36 var resolvedSymbol = utils.ImportNow("intl_resolved_symbol"); |
| 38 var SetFunctionName = utils.SetFunctionName; | 37 var SetFunctionName = utils.SetFunctionName; |
| 39 var StringIndexOf; | 38 var StringIndexOf; |
| 40 var StringLastIndexOf; | 39 var StringLastIndexOf; |
| 41 var StringSubstr; | 40 var StringSubstr; |
| 42 var StringSubstring; | 41 var StringSubstring; |
| 43 | 42 |
| 44 utils.Import(function(from) { | 43 utils.Import(function(from) { |
| 45 ArrayIndexOf = from.ArrayIndexOf; | |
| 46 ArrayJoin = from.ArrayJoin; | 44 ArrayJoin = from.ArrayJoin; |
| 47 ArrayPush = from.ArrayPush; | 45 ArrayPush = from.ArrayPush; |
| 48 IsNaN = from.IsNaN; | 46 IsNaN = from.IsNaN; |
| 49 InternalRegExpMatch = from.InternalRegExpMatch; | 47 InternalRegExpMatch = from.InternalRegExpMatch; |
| 50 InternalRegExpReplace = from.InternalRegExpReplace; | 48 InternalRegExpReplace = from.InternalRegExpReplace; |
| 51 StringIndexOf = from.StringIndexOf; | 49 StringIndexOf = from.StringIndexOf; |
| 52 StringLastIndexOf = from.StringLastIndexOf; | 50 StringLastIndexOf = from.StringLastIndexOf; |
| 53 StringSubstr = from.StringSubstr; | 51 StringSubstr = from.StringSubstr; |
| 54 StringSubstring = from.StringSubstring; | 52 StringSubstring = from.StringSubstring; |
| 55 }); | 53 }); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 case 'string': | 360 case 'string': |
| 363 value = TO_STRING(value); | 361 value = TO_STRING(value); |
| 364 break; | 362 break; |
| 365 case 'number': | 363 case 'number': |
| 366 value = TO_NUMBER(value); | 364 value = TO_NUMBER(value); |
| 367 break; | 365 break; |
| 368 default: | 366 default: |
| 369 throw %make_error(kWrongValueType); | 367 throw %make_error(kWrongValueType); |
| 370 } | 368 } |
| 371 | 369 |
| 372 if (!IS_UNDEFINED(values) && %_Call(ArrayIndexOf, values, value) === -1) { | 370 if (!IS_UNDEFINED(values) && %ArrayIndexOf(values, value, 0) === -1) { |
| 373 throw %make_range_error(kValueOutOfRange, value, caller, property); | 371 throw %make_range_error(kValueOutOfRange, value, caller, property); |
| 374 } | 372 } |
| 375 | 373 |
| 376 return value; | 374 return value; |
| 377 } | 375 } |
| 378 | 376 |
| 379 return defaultValue; | 377 return defaultValue; |
| 380 } | 378 } |
| 381 | 379 |
| 382 return getOption; | 380 return getOption; |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 | 761 |
| 764 var o = TO_OBJECT(locales); | 762 var o = TO_OBJECT(locales); |
| 765 var len = TO_UINT32(o.length); | 763 var len = TO_UINT32(o.length); |
| 766 | 764 |
| 767 for (var k = 0; k < len; k++) { | 765 for (var k = 0; k < len; k++) { |
| 768 if (k in o) { | 766 if (k in o) { |
| 769 var value = o[k]; | 767 var value = o[k]; |
| 770 | 768 |
| 771 var tag = canonicalizeLanguageTag(value); | 769 var tag = canonicalizeLanguageTag(value); |
| 772 | 770 |
| 773 if (%_Call(ArrayIndexOf, seen, tag) === -1) { | 771 if (%ArrayIndexOf(seen, tag, 0) === -1) { |
| 774 %_Call(ArrayPush, seen, tag); | 772 %_Call(ArrayPush, seen, tag); |
| 775 } | 773 } |
| 776 } | 774 } |
| 777 } | 775 } |
| 778 } | 776 } |
| 779 | 777 |
| 780 return freezeArray(seen); | 778 return freezeArray(seen); |
| 781 } | 779 } |
| 782 | 780 |
| 783 | 781 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 809 // Skip language since it can match variant regex, so we start from 1. | 807 // Skip language since it can match variant regex, so we start from 1. |
| 810 // We are matching i-klingon here, but that's ok, since i-klingon-klingon | 808 // We are matching i-klingon here, but that's ok, since i-klingon-klingon |
| 811 // is not valid and would fail LANGUAGE_TAG_RE test. | 809 // is not valid and would fail LANGUAGE_TAG_RE test. |
| 812 var variants = new InternalArray(); | 810 var variants = new InternalArray(); |
| 813 var extensions = new InternalArray(); | 811 var extensions = new InternalArray(); |
| 814 var parts = %StringSplit(locale, '-', kMaxUint32); | 812 var parts = %StringSplit(locale, '-', kMaxUint32); |
| 815 for (var i = 1; i < parts.length; i++) { | 813 for (var i = 1; i < parts.length; i++) { |
| 816 var value = parts[i]; | 814 var value = parts[i]; |
| 817 if (!IS_NULL(InternalRegExpMatch(GetLanguageVariantRE(), value)) && | 815 if (!IS_NULL(InternalRegExpMatch(GetLanguageVariantRE(), value)) && |
| 818 extensions.length === 0) { | 816 extensions.length === 0) { |
| 819 if (%_Call(ArrayIndexOf, variants, value) === -1) { | 817 if (%ArrayIndexOf(variants, value, 0) === -1) { |
| 820 %_Call(ArrayPush, variants, value); | 818 %_Call(ArrayPush, variants, value); |
| 821 } else { | 819 } else { |
| 822 return false; | 820 return false; |
| 823 } | 821 } |
| 824 } | 822 } |
| 825 | 823 |
| 826 if (!IS_NULL(InternalRegExpMatch(GetLanguageSingletonRE(), value))) { | 824 if (!IS_NULL(InternalRegExpMatch(GetLanguageSingletonRE(), value))) { |
| 827 if (%_Call(ArrayIndexOf, extensions, value) === -1) { | 825 if (%ArrayIndexOf(extensions, value, 0) === -1) { |
| 828 %_Call(ArrayPush, extensions, value); | 826 %_Call(ArrayPush, extensions, value); |
| 829 } else { | 827 } else { |
| 830 return false; | 828 return false; |
| 831 } | 829 } |
| 832 } | 830 } |
| 833 } | 831 } |
| 834 | 832 |
| 835 return true; | 833 return true; |
| 836 } | 834 } |
| 837 | 835 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 | 940 |
| 943 /** | 941 /** |
| 944 * Allowed -u-co- values. List taken from: | 942 * Allowed -u-co- values. List taken from: |
| 945 * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml | 943 * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml |
| 946 */ | 944 */ |
| 947 var ALLOWED_CO_VALUES = [ | 945 var ALLOWED_CO_VALUES = [ |
| 948 'big5han', 'dict', 'direct', 'ducet', 'gb2312', 'phonebk', 'phonetic', | 946 'big5han', 'dict', 'direct', 'ducet', 'gb2312', 'phonebk', 'phonetic', |
| 949 'pinyin', 'reformed', 'searchjl', 'stroke', 'trad', 'unihan', 'zhuyin' | 947 'pinyin', 'reformed', 'searchjl', 'stroke', 'trad', 'unihan', 'zhuyin' |
| 950 ]; | 948 ]; |
| 951 | 949 |
| 952 if (%_Call(ArrayIndexOf, ALLOWED_CO_VALUES, extensionMap.co) !== -1) { | 950 if (%ArrayIndexOf(ALLOWED_CO_VALUES, extensionMap.co, 0) !== -1) { |
| 953 extension = '-u-co-' + extensionMap.co; | 951 extension = '-u-co-' + extensionMap.co; |
| 954 // ICU can't tell us what the collation is, so save user's input. | 952 // ICU can't tell us what the collation is, so save user's input. |
| 955 collation = extensionMap.co; | 953 collation = extensionMap.co; |
| 956 } | 954 } |
| 957 } else if (internalOptions.usage === 'search') { | 955 } else if (internalOptions.usage === 'search') { |
| 958 extension = '-u-co-search'; | 956 extension = '-u-co-search'; |
| 959 } | 957 } |
| 960 defineWEProperty(internalOptions, 'collation', collation); | 958 defineWEProperty(internalOptions, 'collation', collation); |
| 961 | 959 |
| 962 var requestedLocale = locale.locale + extension; | 960 var requestedLocale = locale.locale + extension; |
| (...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2034 language = locales.length > 0 ? locales[0] : GetDefaultICULocaleJS(); | 2032 language = locales.length > 0 ? locales[0] : GetDefaultICULocaleJS(); |
| 2035 } | 2033 } |
| 2036 | 2034 |
| 2037 // StringSplit is slower than this. | 2035 // StringSplit is slower than this. |
| 2038 var pos = %_Call(StringIndexOf, language, '-'); | 2036 var pos = %_Call(StringIndexOf, language, '-'); |
| 2039 if (pos != -1) { | 2037 if (pos != -1) { |
| 2040 language = %_Call(StringSubstring, language, 0, pos); | 2038 language = %_Call(StringSubstring, language, 0, pos); |
| 2041 } | 2039 } |
| 2042 | 2040 |
| 2043 var CUSTOM_CASE_LANGUAGES = ['az', 'el', 'lt', 'tr']; | 2041 var CUSTOM_CASE_LANGUAGES = ['az', 'el', 'lt', 'tr']; |
| 2044 var langIndex = %_Call(ArrayIndexOf, CUSTOM_CASE_LANGUAGES, language); | 2042 var langIndex = %ArrayIndexOf(CUSTOM_CASE_LANGUAGES, language, 0); |
| 2045 if (langIndex == -1) { | 2043 if (langIndex == -1) { |
| 2046 // language-independent case conversion. | 2044 // language-independent case conversion. |
| 2047 return isToUpper ? %StringToUpperCaseI18N(s) : %StringToLowerCaseI18N(s); | 2045 return isToUpper ? %StringToUpperCaseI18N(s) : %StringToLowerCaseI18N(s); |
| 2048 } | 2046 } |
| 2049 return %StringLocaleConvertCase(s, isToUpper, | 2047 return %StringLocaleConvertCase(s, isToUpper, |
| 2050 CUSTOM_CASE_LANGUAGES[langIndex]); | 2048 CUSTOM_CASE_LANGUAGES[langIndex]); |
| 2051 } | 2049 } |
| 2052 | 2050 |
| 2053 /** | 2051 /** |
| 2054 * Compares this and that, and returns less than 0, 0 or greater than 0 value. | 2052 * Compares this and that, and returns less than 0, 0 or greater than 0 value. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2085 } | 2083 } |
| 2086 | 2084 |
| 2087 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 2085 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
| 2088 var s = TO_STRING(this); | 2086 var s = TO_STRING(this); |
| 2089 | 2087 |
| 2090 var formArg = arguments[0]; | 2088 var formArg = arguments[0]; |
| 2091 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); | 2089 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); |
| 2092 | 2090 |
| 2093 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; | 2091 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; |
| 2094 | 2092 |
| 2095 var normalizationForm = %_Call(ArrayIndexOf, NORMALIZATION_FORMS, form); | 2093 var normalizationForm = %ArrayIndexOf(NORMALIZATION_FORMS, form, 0); |
| 2096 if (normalizationForm === -1) { | 2094 if (normalizationForm === -1) { |
| 2097 throw %make_range_error(kNormalizationForm, | 2095 throw %make_range_error(kNormalizationForm, |
| 2098 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); | 2096 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); |
| 2099 } | 2097 } |
| 2100 | 2098 |
| 2101 return %StringNormalize(s, normalizationForm); | 2099 return %StringNormalize(s, normalizationForm); |
| 2102 } | 2100 } |
| 2103 ); | 2101 ); |
| 2104 | 2102 |
| 2105 function ToLowerCaseI18N() { | 2103 function ToLowerCaseI18N() { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2246 } | 2244 } |
| 2247 ); | 2245 ); |
| 2248 | 2246 |
| 2249 utils.Export(function(to) { | 2247 utils.Export(function(to) { |
| 2250 to.AddBoundMethod = AddBoundMethod; | 2248 to.AddBoundMethod = AddBoundMethod; |
| 2251 to.IntlParseDate = IntlParseDate; | 2249 to.IntlParseDate = IntlParseDate; |
| 2252 to.IntlParseNumber = IntlParseNumber; | 2250 to.IntlParseNumber = IntlParseNumber; |
| 2253 }); | 2251 }); |
| 2254 | 2252 |
| 2255 }) | 2253 }) |
| OLD | NEW |