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; | 20 var ArrayIndexOf; |
21 var ArrayJoin; | 21 var ArrayJoin; |
22 var ArrayPush; | 22 var ArrayPush; |
23 var GlobalBoolean = global.Boolean; | 23 var GlobalBoolean = global.Boolean; |
24 var GlobalDate = global.Date; | 24 var GlobalDate = global.Date; |
25 var GlobalNumber = global.Number; | 25 var GlobalNumber = global.Number; |
26 var GlobalRegExp = global.RegExp; | 26 var GlobalRegExp = global.RegExp; |
27 var GlobalString = global.String; | 27 var GlobalString = global.String; |
28 var InstallFunctions = utils.InstallFunctions; | 28 var InstallFunctions = utils.InstallFunctions; |
29 var InstallGetter = utils.InstallGetter; | 29 var InstallGetter = utils.InstallGetter; |
30 var InternalPackedArray = utils.InternalPackedArray; | 30 var InternalArray = utils.InternalArray; |
31 var InternalRegExpMatch; | 31 var InternalRegExpMatch; |
32 var InternalRegExpReplace | 32 var InternalRegExpReplace |
33 var IsFinite; | 33 var IsFinite; |
34 var IsNaN; | 34 var IsNaN; |
35 var MakeError; | 35 var MakeError; |
36 var MakeRangeError; | 36 var MakeRangeError; |
37 var MakeTypeError; | 37 var MakeTypeError; |
38 var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty"); | 38 var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty"); |
39 var OverrideFunction = utils.OverrideFunction; | 39 var OverrideFunction = utils.OverrideFunction; |
40 var patternSymbol = utils.ImportNow("intl_pattern_symbol"); | 40 var patternSymbol = utils.ImportNow("intl_pattern_symbol"); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 requestedLocales, AVAILABLE_LOCALES[service])); | 298 requestedLocales, AVAILABLE_LOCALES[service])); |
299 } | 299 } |
300 | 300 |
301 | 301 |
302 /** | 302 /** |
303 * Returns the subset of the provided BCP 47 language priority list for which | 303 * Returns the subset of the provided BCP 47 language priority list for which |
304 * this service has a matching locale when using the BCP 47 Lookup algorithm. | 304 * this service has a matching locale when using the BCP 47 Lookup algorithm. |
305 * Locales appear in the same order in the returned list as in the input list. | 305 * Locales appear in the same order in the returned list as in the input list. |
306 */ | 306 */ |
307 function lookupSupportedLocalesOf(requestedLocales, availableLocales) { | 307 function lookupSupportedLocalesOf(requestedLocales, availableLocales) { |
308 var matchedLocales = []; | 308 var matchedLocales = new InternalArray(); |
309 for (var i = 0; i < requestedLocales.length; ++i) { | 309 for (var i = 0; i < requestedLocales.length; ++i) { |
310 // Remove -u- extension. | 310 // Remove -u- extension. |
311 var locale = InternalRegExpReplace( | 311 var locale = InternalRegExpReplace( |
312 GetUnicodeExtensionRE(), requestedLocales[i], ''); | 312 GetUnicodeExtensionRE(), requestedLocales[i], ''); |
313 do { | 313 do { |
314 if (!IS_UNDEFINED(availableLocales[locale])) { | 314 if (!IS_UNDEFINED(availableLocales[locale])) { |
315 // Push requested locale not the resolved one. | 315 // Push requested locale not the resolved one. |
316 %_Call(ArrayPush, matchedLocales, requestedLocales[i]); | 316 %_Call(ArrayPush, matchedLocales, requestedLocales[i]); |
317 break; | 317 break; |
318 } | 318 } |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
558 } | 558 } |
559 } | 559 } |
560 } | 560 } |
561 } | 561 } |
562 | 562 |
563 return extension === ''? '' : '-u' + extension; | 563 return extension === ''? '' : '-u' + extension; |
564 } | 564 } |
565 | 565 |
566 | 566 |
567 /** | 567 /** |
568 * Converts all OwnProperties into | 568 * Given an array-like, outputs an Array with the numbered |
569 * properties copied over and defined | |
569 * configurable: false, writable: false, enumerable: true. | 570 * configurable: false, writable: false, enumerable: true. |
570 */ | 571 */ |
571 function freezeArray(array) { | 572 function freezeArray(input) { |
572 var l = array.length; | 573 var array = []; |
574 var l = input.length; | |
573 for (var i = 0; i < l; i++) { | 575 for (var i = 0; i < l; i++) { |
Yang
2016/04/27 04:41:21
Would %MoveArrayContents do the same?
Dan Ehrenberg
2016/04/27 04:51:34
I'd still need to freeze each entry. Maybe Object.
| |
574 if (i in array) { | 576 if (i in input) { |
575 %object_define_property(array, i, {value: array[i], | 577 %object_define_property(array, i, {value: input[i], |
576 configurable: false, | 578 configurable: false, |
577 writable: false, | 579 writable: false, |
578 enumerable: true}); | 580 enumerable: true}); |
579 } | 581 } |
580 } | 582 } |
581 | 583 |
582 %object_define_property(array, 'length', {value: l, writable: false}); | 584 %object_define_property(array, 'length', {value: l, writable: false}); |
583 return array; | 585 return array; |
584 } | 586 } |
585 | 587 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
742 | 744 |
743 return tag; | 745 return tag; |
744 } | 746 } |
745 | 747 |
746 | 748 |
747 /** | 749 /** |
748 * Returns an array where all locales are canonicalized and duplicates removed. | 750 * Returns an array where all locales are canonicalized and duplicates removed. |
749 * Throws on locales that are not well formed BCP47 tags. | 751 * Throws on locales that are not well formed BCP47 tags. |
750 */ | 752 */ |
751 function initializeLocaleList(locales) { | 753 function initializeLocaleList(locales) { |
752 var seen = []; | 754 var seen = new InternalArray(); |
753 if (IS_UNDEFINED(locales)) { | 755 if (!IS_UNDEFINED(locales)) { |
754 // Constructor is called without arguments. | |
755 seen = []; | |
756 } else { | |
757 // We allow single string localeID. | 756 // We allow single string localeID. |
758 if (typeof locales === 'string') { | 757 if (typeof locales === 'string') { |
759 %_Call(ArrayPush, seen, canonicalizeLanguageTag(locales)); | 758 %_Call(ArrayPush, seen, canonicalizeLanguageTag(locales)); |
760 return freezeArray(seen); | 759 return freezeArray(seen); |
761 } | 760 } |
762 | 761 |
763 var o = TO_OBJECT(locales); | 762 var o = TO_OBJECT(locales); |
764 var len = TO_UINT32(o.length); | 763 var len = TO_UINT32(o.length); |
765 | 764 |
766 for (var k = 0; k < len; k++) { | 765 for (var k = 0; k < len; k++) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
801 } | 800 } |
802 | 801 |
803 // Check if there are any duplicate variants or singletons (extensions). | 802 // Check if there are any duplicate variants or singletons (extensions). |
804 | 803 |
805 // Remove private use section. | 804 // Remove private use section. |
806 locale = %_Call(StringSplit, locale, '-x-')[0]; | 805 locale = %_Call(StringSplit, locale, '-x-')[0]; |
807 | 806 |
808 // 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. |
809 // 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 |
810 // is not valid and would fail LANGUAGE_TAG_RE test. | 809 // is not valid and would fail LANGUAGE_TAG_RE test. |
811 var variants = []; | 810 var variants = new InternalArray(); |
812 var extensions = []; | 811 var extensions = new InternalArray(); |
813 var parts = %_Call(StringSplit, locale, '-'); | 812 var parts = %_Call(StringSplit, locale, '-'); |
814 for (var i = 1; i < parts.length; i++) { | 813 for (var i = 1; i < parts.length; i++) { |
815 var value = parts[i]; | 814 var value = parts[i]; |
816 if (!IS_NULL(InternalRegExpMatch(GetLanguageVariantRE(), value)) && | 815 if (!IS_NULL(InternalRegExpMatch(GetLanguageVariantRE(), value)) && |
817 extensions.length === 0) { | 816 extensions.length === 0) { |
818 if (%_Call(ArrayIndexOf, variants, value) === -1) { | 817 if (%_Call(ArrayIndexOf, variants, value) === -1) { |
819 %_Call(ArrayPush, variants, value); | 818 %_Call(ArrayPush, variants, value); |
820 } else { | 819 } else { |
821 return false; | 820 return false; |
822 } | 821 } |
(...skipping 1307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2130 } | 2129 } |
2131 | 2130 |
2132 var locales = arguments[0]; | 2131 var locales = arguments[0]; |
2133 var options = arguments[1]; | 2132 var options = arguments[1]; |
2134 return toLocaleDateTime( | 2133 return toLocaleDateTime( |
2135 this, locales, options, 'time', 'time', 'dateformattime'); | 2134 this, locales, options, 'time', 'time', 'dateformattime'); |
2136 } | 2135 } |
2137 ); | 2136 ); |
2138 | 2137 |
2139 }) | 2138 }) |
OLD | NEW |