| 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() { | 11 (function() { |
| 12 | 12 |
| 13 "use strict"; | 13 "use strict"; |
| 14 | 14 |
| 15 %CheckIsBootstrapping(); | 15 %CheckIsBootstrapping(); |
| 16 | 16 |
| 17 var GlobalDate = global.Date; | 17 var GlobalDate = global.Date; |
| 18 var GlobalRegExp = global.RegExp; |
| 19 var GlobalString = global.String; |
| 18 | 20 |
| 19 var undefined = global.undefined; | 21 var undefined = global.undefined; |
| 20 | 22 |
| 21 var Intl = {}; | 23 var Intl = {}; |
| 22 | 24 |
| 23 %AddNamedProperty(global, "Intl", Intl, DONT_ENUM); | 25 %AddNamedProperty(global, "Intl", Intl, DONT_ENUM); |
| 24 | 26 |
| 25 var AVAILABLE_SERVICES = ['collator', | 27 var AVAILABLE_SERVICES = ['collator', |
| 26 'numberformat', | 28 'numberformat', |
| 27 'dateformat', | 29 'dateformat', |
| (...skipping 19 matching lines...) Expand all Loading... |
| 47 */ | 49 */ |
| 48 var DEFAULT_ICU_LOCALE = undefined; | 50 var DEFAULT_ICU_LOCALE = undefined; |
| 49 | 51 |
| 50 /** | 52 /** |
| 51 * Unicode extension regular expression. | 53 * Unicode extension regular expression. |
| 52 */ | 54 */ |
| 53 var UNICODE_EXTENSION_RE = undefined; | 55 var UNICODE_EXTENSION_RE = undefined; |
| 54 | 56 |
| 55 function GetUnicodeExtensionRE() { | 57 function GetUnicodeExtensionRE() { |
| 56 if (UNICODE_EXTENSION_RE === undefined) { | 58 if (UNICODE_EXTENSION_RE === undefined) { |
| 57 UNICODE_EXTENSION_RE = new $RegExp('-u(-[a-z0-9]{2,8})+', 'g'); | 59 UNICODE_EXTENSION_RE = new GlobalRegExp('-u(-[a-z0-9]{2,8})+', 'g'); |
| 58 } | 60 } |
| 59 return UNICODE_EXTENSION_RE; | 61 return UNICODE_EXTENSION_RE; |
| 60 } | 62 } |
| 61 | 63 |
| 62 /** | 64 /** |
| 63 * Matches any Unicode extension. | 65 * Matches any Unicode extension. |
| 64 */ | 66 */ |
| 65 var ANY_EXTENSION_RE = undefined; | 67 var ANY_EXTENSION_RE = undefined; |
| 66 | 68 |
| 67 function GetAnyExtensionRE() { | 69 function GetAnyExtensionRE() { |
| 68 if (ANY_EXTENSION_RE === undefined) { | 70 if (ANY_EXTENSION_RE === undefined) { |
| 69 ANY_EXTENSION_RE = new $RegExp('-[a-z0-9]{1}-.*', 'g'); | 71 ANY_EXTENSION_RE = new GlobalRegExp('-[a-z0-9]{1}-.*', 'g'); |
| 70 } | 72 } |
| 71 return ANY_EXTENSION_RE; | 73 return ANY_EXTENSION_RE; |
| 72 } | 74 } |
| 73 | 75 |
| 74 /** | 76 /** |
| 75 * Replace quoted text (single quote, anything but the quote and quote again). | 77 * Replace quoted text (single quote, anything but the quote and quote again). |
| 76 */ | 78 */ |
| 77 var QUOTED_STRING_RE = undefined; | 79 var QUOTED_STRING_RE = undefined; |
| 78 | 80 |
| 79 function GetQuotedStringRE() { | 81 function GetQuotedStringRE() { |
| 80 if (QUOTED_STRING_RE === undefined) { | 82 if (QUOTED_STRING_RE === undefined) { |
| 81 QUOTED_STRING_RE = new $RegExp("'[^']+'", 'g'); | 83 QUOTED_STRING_RE = new GlobalRegExp("'[^']+'", 'g'); |
| 82 } | 84 } |
| 83 return QUOTED_STRING_RE; | 85 return QUOTED_STRING_RE; |
| 84 } | 86 } |
| 85 | 87 |
| 86 /** | 88 /** |
| 87 * Matches valid service name. | 89 * Matches valid service name. |
| 88 */ | 90 */ |
| 89 var SERVICE_RE = undefined; | 91 var SERVICE_RE = undefined; |
| 90 | 92 |
| 91 function GetServiceRE() { | 93 function GetServiceRE() { |
| 92 if (SERVICE_RE === undefined) { | 94 if (SERVICE_RE === undefined) { |
| 93 SERVICE_RE = | 95 SERVICE_RE = |
| 94 new $RegExp('^(collator|numberformat|dateformat|breakiterator)$'); | 96 new GlobalRegExp('^(collator|numberformat|dateformat|breakiterator)$'); |
| 95 } | 97 } |
| 96 return SERVICE_RE; | 98 return SERVICE_RE; |
| 97 } | 99 } |
| 98 | 100 |
| 99 /** | 101 /** |
| 100 * Validates a language tag against bcp47 spec. | 102 * Validates a language tag against bcp47 spec. |
| 101 * Actual value is assigned on first run. | 103 * Actual value is assigned on first run. |
| 102 */ | 104 */ |
| 103 var LANGUAGE_TAG_RE = undefined; | 105 var LANGUAGE_TAG_RE = undefined; |
| 104 | 106 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 134 } | 136 } |
| 135 | 137 |
| 136 /** | 138 /** |
| 137 * Matches valid IANA time zone names. | 139 * Matches valid IANA time zone names. |
| 138 */ | 140 */ |
| 139 var TIMEZONE_NAME_CHECK_RE = undefined; | 141 var TIMEZONE_NAME_CHECK_RE = undefined; |
| 140 | 142 |
| 141 function GetTimezoneNameCheckRE() { | 143 function GetTimezoneNameCheckRE() { |
| 142 if (TIMEZONE_NAME_CHECK_RE === undefined) { | 144 if (TIMEZONE_NAME_CHECK_RE === undefined) { |
| 143 TIMEZONE_NAME_CHECK_RE = | 145 TIMEZONE_NAME_CHECK_RE = |
| 144 new $RegExp('^([A-Za-z]+)/([A-Za-z]+)(?:_([A-Za-z]+))*$'); | 146 new GlobalRegExp('^([A-Za-z]+)/([A-Za-z]+)(?:_([A-Za-z]+))*$'); |
| 145 } | 147 } |
| 146 return TIMEZONE_NAME_CHECK_RE; | 148 return TIMEZONE_NAME_CHECK_RE; |
| 147 } | 149 } |
| 148 | 150 |
| 149 /** | 151 /** |
| 150 * Maps ICU calendar names into LDML type. | 152 * Maps ICU calendar names into LDML type. |
| 151 */ | 153 */ |
| 152 var ICU_CALENDAR_MAP = { | 154 var ICU_CALENDAR_MAP = { |
| 153 'gregorian': 'gregory', | 155 'gregorian': 'gregory', |
| 154 'japanese': 'japanese', | 156 'japanese': 'japanese', |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 | 284 |
| 283 // Provide defaults if matcher was not specified. | 285 // Provide defaults if matcher was not specified. |
| 284 if (options === undefined) { | 286 if (options === undefined) { |
| 285 options = {}; | 287 options = {}; |
| 286 } else { | 288 } else { |
| 287 options = ToObject(options); | 289 options = ToObject(options); |
| 288 } | 290 } |
| 289 | 291 |
| 290 var matcher = options.localeMatcher; | 292 var matcher = options.localeMatcher; |
| 291 if (matcher !== undefined) { | 293 if (matcher !== undefined) { |
| 292 matcher = $String(matcher); | 294 matcher = GlobalString(matcher); |
| 293 if (matcher !== 'lookup' && matcher !== 'best fit') { | 295 if (matcher !== 'lookup' && matcher !== 'best fit') { |
| 294 throw new $RangeError('Illegal value for localeMatcher:' + matcher); | 296 throw new $RangeError('Illegal value for localeMatcher:' + matcher); |
| 295 } | 297 } |
| 296 } else { | 298 } else { |
| 297 matcher = 'best fit'; | 299 matcher = 'best fit'; |
| 298 } | 300 } |
| 299 | 301 |
| 300 var requestedLocales = initializeLocaleList(locales); | 302 var requestedLocales = initializeLocaleList(locales); |
| 301 | 303 |
| 302 // Cache these, they don't ever change per service. | 304 // Cache these, they don't ever change per service. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 370 } |
| 369 | 371 |
| 370 var getOption = function getOption(property, type, values, defaultValue) { | 372 var getOption = function getOption(property, type, values, defaultValue) { |
| 371 if (options[property] !== undefined) { | 373 if (options[property] !== undefined) { |
| 372 var value = options[property]; | 374 var value = options[property]; |
| 373 switch (type) { | 375 switch (type) { |
| 374 case 'boolean': | 376 case 'boolean': |
| 375 value = $Boolean(value); | 377 value = $Boolean(value); |
| 376 break; | 378 break; |
| 377 case 'string': | 379 case 'string': |
| 378 value = $String(value); | 380 value = GlobalString(value); |
| 379 break; | 381 break; |
| 380 case 'number': | 382 case 'number': |
| 381 value = $Number(value); | 383 value = $Number(value); |
| 382 break; | 384 break; |
| 383 default: | 385 default: |
| 384 throw new $Error('Internal error. Wrong value type.'); | 386 throw new $Error('Internal error. Wrong value type.'); |
| 385 } | 387 } |
| 386 if (values !== undefined && values.indexOf(value) === -1) { | 388 if (values !== undefined && values.indexOf(value) === -1) { |
| 387 throw new $RangeError('Value ' + value + ' out of range for ' + caller + | 389 throw new $RangeError('Value ' + value + ' out of range for ' + caller + |
| 388 ' options property ' + property); | 390 ' options property ' + property); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 * Unicode extensions for passing parameters to ICU). | 526 * Unicode extensions for passing parameters to ICU). |
| 525 * It's used for extension-option pairs only, e.g. kn-normalization, but not | 527 * It's used for extension-option pairs only, e.g. kn-normalization, but not |
| 526 * for 'sensitivity' since it doesn't have extension equivalent. | 528 * for 'sensitivity' since it doesn't have extension equivalent. |
| 527 * Extensions like nu and ca don't have options equivalent, so we place | 529 * Extensions like nu and ca don't have options equivalent, so we place |
| 528 * undefined in the map.property to denote that. | 530 * undefined in the map.property to denote that. |
| 529 */ | 531 */ |
| 530 function setOptions(inOptions, extensionMap, keyValues, getOption, outOptions) { | 532 function setOptions(inOptions, extensionMap, keyValues, getOption, outOptions) { |
| 531 var extension = ''; | 533 var extension = ''; |
| 532 | 534 |
| 533 var updateExtension = function updateExtension(key, value) { | 535 var updateExtension = function updateExtension(key, value) { |
| 534 return '-' + key + '-' + $String(value); | 536 return '-' + key + '-' + GlobalString(value); |
| 535 } | 537 } |
| 536 | 538 |
| 537 var updateProperty = function updateProperty(property, type, value) { | 539 var updateProperty = function updateProperty(property, type, value) { |
| 538 if (type === 'boolean' && (typeof value === 'string')) { | 540 if (type === 'boolean' && (typeof value === 'string')) { |
| 539 value = (value === 'true') ? true : false; | 541 value = (value === 'true') ? true : false; |
| 540 } | 542 } |
| 541 | 543 |
| 542 if (property !== undefined) { | 544 if (property !== undefined) { |
| 543 defineWEProperty(outOptions, property, value); | 545 defineWEProperty(outOptions, property, value); |
| 544 } | 546 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 if (original === resolved) { | 615 if (original === resolved) { |
| 614 return original; | 616 return original; |
| 615 } | 617 } |
| 616 | 618 |
| 617 var locales = %GetLanguageTagVariants([original, resolved]); | 619 var locales = %GetLanguageTagVariants([original, resolved]); |
| 618 if (locales[0].maximized !== locales[1].maximized) { | 620 if (locales[0].maximized !== locales[1].maximized) { |
| 619 return resolved; | 621 return resolved; |
| 620 } | 622 } |
| 621 | 623 |
| 622 // Preserve extensions of resolved locale, but swap base tags with original. | 624 // Preserve extensions of resolved locale, but swap base tags with original. |
| 623 var resolvedBase = new $RegExp('^' + locales[1].base); | 625 var resolvedBase = new GlobalRegExp('^' + locales[1].base); |
| 624 return resolved.replace(resolvedBase, locales[0].base); | 626 return resolved.replace(resolvedBase, locales[0].base); |
| 625 } | 627 } |
| 626 | 628 |
| 627 | 629 |
| 628 /** | 630 /** |
| 629 * Returns an Object that contains all of supported locales for a given | 631 * Returns an Object that contains all of supported locales for a given |
| 630 * service. | 632 * service. |
| 631 * In addition to the supported locales we add xx-ZZ locale for each xx-Yyyy-ZZ | 633 * In addition to the supported locales we add xx-ZZ locale for each xx-Yyyy-ZZ |
| 632 * that is supported. This is required by the spec. | 634 * that is supported. This is required by the spec. |
| 633 */ | 635 */ |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 /** | 705 /** |
| 704 * Canonicalizes the language tag, or throws in case the tag is invalid. | 706 * Canonicalizes the language tag, or throws in case the tag is invalid. |
| 705 */ | 707 */ |
| 706 function canonicalizeLanguageTag(localeID) { | 708 function canonicalizeLanguageTag(localeID) { |
| 707 // null is typeof 'object' so we have to do extra check. | 709 // null is typeof 'object' so we have to do extra check. |
| 708 if (typeof localeID !== 'string' && typeof localeID !== 'object' || | 710 if (typeof localeID !== 'string' && typeof localeID !== 'object' || |
| 709 IS_NULL(localeID)) { | 711 IS_NULL(localeID)) { |
| 710 throw new $TypeError('Language ID should be string or object.'); | 712 throw new $TypeError('Language ID should be string or object.'); |
| 711 } | 713 } |
| 712 | 714 |
| 713 var localeString = $String(localeID); | 715 var localeString = GlobalString(localeID); |
| 714 | 716 |
| 715 if (isValidLanguageTag(localeString) === false) { | 717 if (isValidLanguageTag(localeString) === false) { |
| 716 throw new $RangeError('Invalid language tag: ' + localeString); | 718 throw new $RangeError('Invalid language tag: ' + localeString); |
| 717 } | 719 } |
| 718 | 720 |
| 719 // This call will strip -kn but not -kn-true extensions. | 721 // This call will strip -kn but not -kn-true extensions. |
| 720 // ICU bug filled - http://bugs.icu-project.org/trac/ticket/9265. | 722 // ICU bug filled - http://bugs.icu-project.org/trac/ticket/9265. |
| 721 // TODO(cira): check if -u-kn-true-kc-true-kh-true still throws after | 723 // TODO(cira): check if -u-kn-true-kc-true-kh-true still throws after |
| 722 // upgrade to ICU 4.9. | 724 // upgrade to ICU 4.9. |
| 723 var tag = %CanonicalizeLanguageTag(localeString); | 725 var tag = %CanonicalizeLanguageTag(localeString); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 var alphanum = '(' + alpha + '|' + digit + ')'; | 834 var alphanum = '(' + alpha + '|' + digit + ')'; |
| 833 var regular = '(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|' + | 835 var regular = '(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|' + |
| 834 'zh-min|zh-min-nan|zh-xiang)'; | 836 'zh-min|zh-min-nan|zh-xiang)'; |
| 835 var irregular = '(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|' + | 837 var irregular = '(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|' + |
| 836 'i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|' + | 838 'i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|' + |
| 837 'i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)'; | 839 'i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)'; |
| 838 var grandfathered = '(' + irregular + '|' + regular + ')'; | 840 var grandfathered = '(' + irregular + '|' + regular + ')'; |
| 839 var privateUse = '(x(-' + alphanum + '{1,8})+)'; | 841 var privateUse = '(x(-' + alphanum + '{1,8})+)'; |
| 840 | 842 |
| 841 var singleton = '(' + digit + '|[A-WY-Za-wy-z])'; | 843 var singleton = '(' + digit + '|[A-WY-Za-wy-z])'; |
| 842 LANGUAGE_SINGLETON_RE = new $RegExp('^' + singleton + '$', 'i'); | 844 LANGUAGE_SINGLETON_RE = new GlobalRegExp('^' + singleton + '$', 'i'); |
| 843 | 845 |
| 844 var extension = '(' + singleton + '(-' + alphanum + '{2,8})+)'; | 846 var extension = '(' + singleton + '(-' + alphanum + '{2,8})+)'; |
| 845 | 847 |
| 846 var variant = '(' + alphanum + '{5,8}|(' + digit + alphanum + '{3}))'; | 848 var variant = '(' + alphanum + '{5,8}|(' + digit + alphanum + '{3}))'; |
| 847 LANGUAGE_VARIANT_RE = new $RegExp('^' + variant + '$', 'i'); | 849 LANGUAGE_VARIANT_RE = new GlobalRegExp('^' + variant + '$', 'i'); |
| 848 | 850 |
| 849 var region = '(' + alpha + '{2}|' + digit + '{3})'; | 851 var region = '(' + alpha + '{2}|' + digit + '{3})'; |
| 850 var script = '(' + alpha + '{4})'; | 852 var script = '(' + alpha + '{4})'; |
| 851 var extLang = '(' + alpha + '{3}(-' + alpha + '{3}){0,2})'; | 853 var extLang = '(' + alpha + '{3}(-' + alpha + '{3}){0,2})'; |
| 852 var language = '(' + alpha + '{2,3}(-' + extLang + ')?|' + alpha + '{4}|' + | 854 var language = '(' + alpha + '{2,3}(-' + extLang + ')?|' + alpha + '{4}|' + |
| 853 alpha + '{5,8})'; | 855 alpha + '{5,8})'; |
| 854 var langTag = language + '(-' + script + ')?(-' + region + ')?(-' + | 856 var langTag = language + '(-' + script + ')?(-' + region + ')?(-' + |
| 855 variant + ')*(-' + extension + ')*(-' + privateUse + ')?'; | 857 variant + ')*(-' + extension + ')*(-' + privateUse + ')?'; |
| 856 | 858 |
| 857 var languageTag = | 859 var languageTag = |
| 858 '^(' + langTag + '|' + privateUse + '|' + grandfathered + ')$'; | 860 '^(' + langTag + '|' + privateUse + '|' + grandfathered + ')$'; |
| 859 LANGUAGE_TAG_RE = new $RegExp(languageTag, 'i'); | 861 LANGUAGE_TAG_RE = new GlobalRegExp(languageTag, 'i'); |
| 860 } | 862 } |
| 861 | 863 |
| 862 /** | 864 /** |
| 863 * Initializes the given object so it's a valid Collator instance. | 865 * Initializes the given object so it's a valid Collator instance. |
| 864 * Useful for subclassing. | 866 * Useful for subclassing. |
| 865 */ | 867 */ |
| 866 function initializeCollator(collator, locales, options) { | 868 function initializeCollator(collator, locales, options) { |
| 867 if (%IsInitializedIntlObject(collator)) { | 869 if (%IsInitializedIntlObject(collator)) { |
| 868 throw new $TypeError('Trying to re-initialize Collator object.'); | 870 throw new $TypeError('Trying to re-initialize Collator object.'); |
| 869 } | 871 } |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1022 * Number other than NaN that represents the result of a locale-sensitive | 1024 * Number other than NaN that represents the result of a locale-sensitive |
| 1023 * String comparison of x with y. | 1025 * String comparison of x with y. |
| 1024 * The result is intended to order String values in the sort order specified | 1026 * The result is intended to order String values in the sort order specified |
| 1025 * by the effective locale and collation options computed during construction | 1027 * by the effective locale and collation options computed during construction |
| 1026 * of this Collator object, and will be negative, zero, or positive, depending | 1028 * of this Collator object, and will be negative, zero, or positive, depending |
| 1027 * on whether x comes before y in the sort order, the Strings are equal under | 1029 * on whether x comes before y in the sort order, the Strings are equal under |
| 1028 * the sort order, or x comes after y in the sort order, respectively. | 1030 * the sort order, or x comes after y in the sort order, respectively. |
| 1029 */ | 1031 */ |
| 1030 function compare(collator, x, y) { | 1032 function compare(collator, x, y) { |
| 1031 return %InternalCompare(%GetImplFromInitializedIntlObject(collator), | 1033 return %InternalCompare(%GetImplFromInitializedIntlObject(collator), |
| 1032 $String(x), $String(y)); | 1034 GlobalString(x), GlobalString(y)); |
| 1033 }; | 1035 }; |
| 1034 | 1036 |
| 1035 | 1037 |
| 1036 addBoundMethod(Intl.Collator, 'compare', compare, 2); | 1038 addBoundMethod(Intl.Collator, 'compare', compare, 2); |
| 1037 | 1039 |
| 1038 /** | 1040 /** |
| 1039 * Verifies that the input is a well-formed ISO 4217 currency code. | 1041 * Verifies that the input is a well-formed ISO 4217 currency code. |
| 1040 * Don't uppercase to test. It could convert invalid code into a valid one. | 1042 * Don't uppercase to test. It could convert invalid code into a valid one. |
| 1041 * For example \u00DFP (Eszett+P) becomes SSP. | 1043 * For example \u00DFP (Eszett+P) becomes SSP. |
| 1042 */ | 1044 */ |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 return %InternalNumberFormat(%GetImplFromInitializedIntlObject(formatter), | 1277 return %InternalNumberFormat(%GetImplFromInitializedIntlObject(formatter), |
| 1276 number); | 1278 number); |
| 1277 } | 1279 } |
| 1278 | 1280 |
| 1279 | 1281 |
| 1280 /** | 1282 /** |
| 1281 * Returns a Number that represents string value that was passed in. | 1283 * Returns a Number that represents string value that was passed in. |
| 1282 */ | 1284 */ |
| 1283 function parseNumber(formatter, value) { | 1285 function parseNumber(formatter, value) { |
| 1284 return %InternalNumberParse(%GetImplFromInitializedIntlObject(formatter), | 1286 return %InternalNumberParse(%GetImplFromInitializedIntlObject(formatter), |
| 1285 $String(value)); | 1287 GlobalString(value)); |
| 1286 } | 1288 } |
| 1287 | 1289 |
| 1288 | 1290 |
| 1289 addBoundMethod(Intl.NumberFormat, 'format', formatNumber, 1); | 1291 addBoundMethod(Intl.NumberFormat, 'format', formatNumber, 1); |
| 1290 addBoundMethod(Intl.NumberFormat, 'v8Parse', parseNumber, 1); | 1292 addBoundMethod(Intl.NumberFormat, 'v8Parse', parseNumber, 1); |
| 1291 | 1293 |
| 1292 /** | 1294 /** |
| 1293 * Returns a string that matches LDML representation of the options object. | 1295 * Returns a string that matches LDML representation of the options object. |
| 1294 */ | 1296 */ |
| 1295 function toLDMLString(options) { | 1297 function toLDMLString(options) { |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1679 | 1681 |
| 1680 | 1682 |
| 1681 /** | 1683 /** |
| 1682 * Returns a Date object representing the result of calling ToString(value) | 1684 * Returns a Date object representing the result of calling ToString(value) |
| 1683 * according to the effective locale and the formatting options of this | 1685 * according to the effective locale and the formatting options of this |
| 1684 * DateTimeFormat. | 1686 * DateTimeFormat. |
| 1685 * Returns undefined if date string cannot be parsed. | 1687 * Returns undefined if date string cannot be parsed. |
| 1686 */ | 1688 */ |
| 1687 function parseDate(formatter, value) { | 1689 function parseDate(formatter, value) { |
| 1688 return %InternalDateParse(%GetImplFromInitializedIntlObject(formatter), | 1690 return %InternalDateParse(%GetImplFromInitializedIntlObject(formatter), |
| 1689 $String(value)); | 1691 GlobalString(value)); |
| 1690 } | 1692 } |
| 1691 | 1693 |
| 1692 | 1694 |
| 1693 // 0 because date is optional argument. | 1695 // 0 because date is optional argument. |
| 1694 addBoundMethod(Intl.DateTimeFormat, 'format', formatDate, 0); | 1696 addBoundMethod(Intl.DateTimeFormat, 'format', formatDate, 0); |
| 1695 addBoundMethod(Intl.DateTimeFormat, 'v8Parse', parseDate, 1); | 1697 addBoundMethod(Intl.DateTimeFormat, 'v8Parse', parseDate, 1); |
| 1696 | 1698 |
| 1697 | 1699 |
| 1698 /** | 1700 /** |
| 1699 * Returns canonical Area/Location name, or throws an exception if the zone | 1701 * Returns canonical Area/Location name, or throws an exception if the zone |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1840 %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); | 1842 %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); |
| 1841 %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); | 1843 %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); |
| 1842 | 1844 |
| 1843 | 1845 |
| 1844 /** | 1846 /** |
| 1845 * Adopts text to segment using the iterator. Old text, if present, | 1847 * Adopts text to segment using the iterator. Old text, if present, |
| 1846 * gets discarded. | 1848 * gets discarded. |
| 1847 */ | 1849 */ |
| 1848 function adoptText(iterator, text) { | 1850 function adoptText(iterator, text) { |
| 1849 %BreakIteratorAdoptText(%GetImplFromInitializedIntlObject(iterator), | 1851 %BreakIteratorAdoptText(%GetImplFromInitializedIntlObject(iterator), |
| 1850 $String(text)); | 1852 GlobalString(text)); |
| 1851 } | 1853 } |
| 1852 | 1854 |
| 1853 | 1855 |
| 1854 /** | 1856 /** |
| 1855 * Returns index of the first break in the string and moves current pointer. | 1857 * Returns index of the first break in the string and moves current pointer. |
| 1856 */ | 1858 */ |
| 1857 function first(iterator) { | 1859 function first(iterator) { |
| 1858 return %BreakIteratorFirst(%GetImplFromInitializedIntlObject(iterator)); | 1860 return %BreakIteratorFirst(%GetImplFromInitializedIntlObject(iterator)); |
| 1859 } | 1861 } |
| 1860 | 1862 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 return defaultObjects[service]; | 1925 return defaultObjects[service]; |
| 1924 } | 1926 } |
| 1925 return new savedObjects[service](locales, useOptions); | 1927 return new savedObjects[service](locales, useOptions); |
| 1926 } | 1928 } |
| 1927 | 1929 |
| 1928 | 1930 |
| 1929 /** | 1931 /** |
| 1930 * Compares this and that, and returns less than 0, 0 or greater than 0 value. | 1932 * Compares this and that, and returns less than 0, 0 or greater than 0 value. |
| 1931 * Overrides the built-in method. | 1933 * Overrides the built-in method. |
| 1932 */ | 1934 */ |
| 1933 OverrideFunction($String.prototype, 'localeCompare', function(that) { | 1935 OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { |
| 1934 if (%_IsConstructCall()) { | 1936 if (%_IsConstructCall()) { |
| 1935 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1937 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); |
| 1936 } | 1938 } |
| 1937 | 1939 |
| 1938 if (IS_NULL_OR_UNDEFINED(this)) { | 1940 if (IS_NULL_OR_UNDEFINED(this)) { |
| 1939 throw new $TypeError('Method invoked on undefined or null value.'); | 1941 throw new $TypeError('Method invoked on undefined or null value.'); |
| 1940 } | 1942 } |
| 1941 | 1943 |
| 1942 var locales = %_Arguments(1); | 1944 var locales = %_Arguments(1); |
| 1943 var options = %_Arguments(2); | 1945 var options = %_Arguments(2); |
| 1944 var collator = cachedOrNewService('collator', locales, options); | 1946 var collator = cachedOrNewService('collator', locales, options); |
| 1945 return compare(collator, this, that); | 1947 return compare(collator, this, that); |
| 1946 } | 1948 } |
| 1947 ); | 1949 ); |
| 1948 | 1950 |
| 1949 | 1951 |
| 1950 /** | 1952 /** |
| 1951 * Unicode normalization. This method is called with one argument that | 1953 * Unicode normalization. This method is called with one argument that |
| 1952 * specifies the normalization form. | 1954 * specifies the normalization form. |
| 1953 * If none is specified, "NFC" is assumed. | 1955 * If none is specified, "NFC" is assumed. |
| 1954 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw | 1956 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw |
| 1955 * a RangeError Exception. | 1957 * a RangeError Exception. |
| 1956 */ | 1958 */ |
| 1957 OverrideFunction($String.prototype, 'normalize', function(that) { | 1959 OverrideFunction(GlobalString.prototype, 'normalize', function(that) { |
| 1958 if (%_IsConstructCall()) { | 1960 if (%_IsConstructCall()) { |
| 1959 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1961 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); |
| 1960 } | 1962 } |
| 1961 | 1963 |
| 1962 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 1964 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
| 1963 | 1965 |
| 1964 var form = $String(%_Arguments(0) || 'NFC'); | 1966 var form = GlobalString(%_Arguments(0) || 'NFC'); |
| 1965 | 1967 |
| 1966 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); | 1968 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); |
| 1967 if (normalizationForm === -1) { | 1969 if (normalizationForm === -1) { |
| 1968 throw new $RangeError('The normalization form should be one of ' | 1970 throw new $RangeError('The normalization form should be one of ' |
| 1969 + NORMALIZATION_FORMS.join(', ') + '.'); | 1971 + NORMALIZATION_FORMS.join(', ') + '.'); |
| 1970 } | 1972 } |
| 1971 | 1973 |
| 1972 return %StringNormalize(this, normalizationForm); | 1974 return %StringNormalize(this, normalizationForm); |
| 1973 } | 1975 } |
| 1974 ); | 1976 ); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2063 } | 2065 } |
| 2064 | 2066 |
| 2065 var locales = %_Arguments(0); | 2067 var locales = %_Arguments(0); |
| 2066 var options = %_Arguments(1); | 2068 var options = %_Arguments(1); |
| 2067 return toLocaleDateTime( | 2069 return toLocaleDateTime( |
| 2068 this, locales, options, 'time', 'time', 'dateformattime'); | 2070 this, locales, options, 'time', 'time', 'dateformattime'); |
| 2069 } | 2071 } |
| 2070 ); | 2072 ); |
| 2071 | 2073 |
| 2072 })(); | 2074 })(); |
| OLD | NEW |