| 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 */ |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 var ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR = | 212 var ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR = |
| 213 'Function object that\'s not a constructor was created with new'; | 213 'Function object that\'s not a constructor was created with new'; |
| 214 | 214 |
| 215 | 215 |
| 216 /** | 216 /** |
| 217 * Adds bound method to the prototype of the given object. | 217 * Adds bound method to the prototype of the given object. |
| 218 */ | 218 */ |
| 219 function addBoundMethod(obj, methodName, implementation, length) { | 219 function addBoundMethod(obj, methodName, implementation, length) { |
| 220 function getter() { | 220 function getter() { |
| 221 if (!%IsInitializedIntlObject(this)) { | 221 if (!%IsInitializedIntlObject(this)) { |
| 222 throw new $TypeError('Method ' + methodName + ' called on a ' + | 222 throw MakeTypeError(kMethodCalledOnWrongObject, methodName); |
| 223 'non-object or on a wrong type of object.'); | |
| 224 } | 223 } |
| 225 var internalName = '__bound' + methodName + '__'; | 224 var internalName = '__bound' + methodName + '__'; |
| 226 if (this[internalName] === undefined) { | 225 if (this[internalName] === undefined) { |
| 227 var that = this; | 226 var that = this; |
| 228 var boundMethod; | 227 var boundMethod; |
| 229 if (length === undefined || length === 2) { | 228 if (length === undefined || length === 2) { |
| 230 boundMethod = function(x, y) { | 229 boundMethod = function(x, y) { |
| 231 if (%_IsConstructCall()) { | 230 if (%_IsConstructCall()) { |
| 232 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 231 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 233 } | 232 } |
| 234 return implementation(that, x, y); | 233 return implementation(that, x, y); |
| 235 } | 234 } |
| 236 } else if (length === 1) { | 235 } else if (length === 1) { |
| 237 boundMethod = function(x) { | 236 boundMethod = function(x) { |
| 238 if (%_IsConstructCall()) { | 237 if (%_IsConstructCall()) { |
| 239 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 238 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 240 } | 239 } |
| 241 return implementation(that, x); | 240 return implementation(that, x); |
| 242 } | 241 } |
| 243 } else { | 242 } else { |
| 244 boundMethod = function() { | 243 boundMethod = function() { |
| 245 if (%_IsConstructCall()) { | 244 if (%_IsConstructCall()) { |
| 246 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 245 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 247 } | 246 } |
| 248 // DateTimeFormat.format needs to be 0 arg method, but can stil | 247 // DateTimeFormat.format needs to be 0 arg method, but can stil |
| 249 // receive optional dateValue param. If one was provided, pass it | 248 // receive optional dateValue param. If one was provided, pass it |
| 250 // along. | 249 // along. |
| 251 if (%_ArgumentsLength() > 0) { | 250 if (%_ArgumentsLength() > 0) { |
| 252 return implementation(that, %_Arguments(0)); | 251 return implementation(that, %_Arguments(0)); |
| 253 } else { | 252 } else { |
| 254 return implementation(that); | 253 return implementation(that); |
| 255 } | 254 } |
| 256 } | 255 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 274 }); | 273 }); |
| 275 } | 274 } |
| 276 | 275 |
| 277 | 276 |
| 278 /** | 277 /** |
| 279 * Returns an intersection of locales and service supported locales. | 278 * Returns an intersection of locales and service supported locales. |
| 280 * Parameter locales is treated as a priority list. | 279 * Parameter locales is treated as a priority list. |
| 281 */ | 280 */ |
| 282 function supportedLocalesOf(service, locales, options) { | 281 function supportedLocalesOf(service, locales, options) { |
| 283 if (IS_NULL(service.match(GetServiceRE()))) { | 282 if (IS_NULL(service.match(GetServiceRE()))) { |
| 284 throw new $Error('Internal error, wrong service type: ' + service); | 283 throw MakeError(kWrongServiceType, service); |
| 285 } | 284 } |
| 286 | 285 |
| 287 // Provide defaults if matcher was not specified. | 286 // Provide defaults if matcher was not specified. |
| 288 if (options === undefined) { | 287 if (options === undefined) { |
| 289 options = {}; | 288 options = {}; |
| 290 } else { | 289 } else { |
| 291 options = ToObject(options); | 290 options = ToObject(options); |
| 292 } | 291 } |
| 293 | 292 |
| 294 var matcher = options.localeMatcher; | 293 var matcher = options.localeMatcher; |
| 295 if (matcher !== undefined) { | 294 if (matcher !== undefined) { |
| 296 matcher = GlobalString(matcher); | 295 matcher = GlobalString(matcher); |
| 297 if (matcher !== 'lookup' && matcher !== 'best fit') { | 296 if (matcher !== 'lookup' && matcher !== 'best fit') { |
| 298 throw new $RangeError('Illegal value for localeMatcher:' + matcher); | 297 throw MakeRangeError(kLocaleMatcher, matcher); |
| 299 } | 298 } |
| 300 } else { | 299 } else { |
| 301 matcher = 'best fit'; | 300 matcher = 'best fit'; |
| 302 } | 301 } |
| 303 | 302 |
| 304 var requestedLocales = initializeLocaleList(locales); | 303 var requestedLocales = initializeLocaleList(locales); |
| 305 | 304 |
| 306 // Cache these, they don't ever change per service. | 305 // Cache these, they don't ever change per service. |
| 307 if (AVAILABLE_LOCALES[service] === undefined) { | 306 if (AVAILABLE_LOCALES[service] === undefined) { |
| 308 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); | 307 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 return lookupSupportedLocalesOf(requestedLocales, availableLocales); | 358 return lookupSupportedLocalesOf(requestedLocales, availableLocales); |
| 360 } | 359 } |
| 361 | 360 |
| 362 | 361 |
| 363 /** | 362 /** |
| 364 * Returns a getOption function that extracts property value for given | 363 * Returns a getOption function that extracts property value for given |
| 365 * options object. If property is missing it returns defaultValue. If value | 364 * options object. If property is missing it returns defaultValue. If value |
| 366 * is out of range for that property it throws RangeError. | 365 * is out of range for that property it throws RangeError. |
| 367 */ | 366 */ |
| 368 function getGetOption(options, caller) { | 367 function getGetOption(options, caller) { |
| 369 if (options === undefined) { | 368 if (options === undefined) throw MakeError(kDefaultOptionsMissing, caller); |
| 370 throw new $Error('Internal ' + caller + ' error. ' + | |
| 371 'Default options are missing.'); | |
| 372 } | |
| 373 | 369 |
| 374 var getOption = function getOption(property, type, values, defaultValue) { | 370 var getOption = function getOption(property, type, values, defaultValue) { |
| 375 if (options[property] !== undefined) { | 371 if (options[property] !== undefined) { |
| 376 var value = options[property]; | 372 var value = options[property]; |
| 377 switch (type) { | 373 switch (type) { |
| 378 case 'boolean': | 374 case 'boolean': |
| 379 value = GlobalBoolean(value); | 375 value = GlobalBoolean(value); |
| 380 break; | 376 break; |
| 381 case 'string': | 377 case 'string': |
| 382 value = GlobalString(value); | 378 value = GlobalString(value); |
| 383 break; | 379 break; |
| 384 case 'number': | 380 case 'number': |
| 385 value = GlobalNumber(value); | 381 value = GlobalNumber(value); |
| 386 break; | 382 break; |
| 387 default: | 383 default: |
| 388 throw new $Error('Internal error. Wrong value type.'); | 384 throw MakeError(kWrongValueType); |
| 389 } | 385 } |
| 390 if (values !== undefined && values.indexOf(value) === -1) { | 386 if (values !== undefined && values.indexOf(value) === -1) { |
| 391 throw new $RangeError('Value ' + value + ' out of range for ' + caller + | 387 throw MakeRangeError(kValueOutOfRange, value, caller, property); |
| 392 ' options property ' + property); | |
| 393 } | 388 } |
| 394 | 389 |
| 395 return value; | 390 return value; |
| 396 } | 391 } |
| 397 | 392 |
| 398 return defaultValue; | 393 return defaultValue; |
| 399 } | 394 } |
| 400 | 395 |
| 401 return getOption; | 396 return getOption; |
| 402 } | 397 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 431 return resolved; | 426 return resolved; |
| 432 } | 427 } |
| 433 | 428 |
| 434 | 429 |
| 435 /** | 430 /** |
| 436 * Returns best matched supported locale and extension info using basic | 431 * Returns best matched supported locale and extension info using basic |
| 437 * lookup algorithm. | 432 * lookup algorithm. |
| 438 */ | 433 */ |
| 439 function lookupMatcher(service, requestedLocales) { | 434 function lookupMatcher(service, requestedLocales) { |
| 440 if (IS_NULL(service.match(GetServiceRE()))) { | 435 if (IS_NULL(service.match(GetServiceRE()))) { |
| 441 throw new $Error('Internal error, wrong service type: ' + service); | 436 throw MakeError(kWrongServiceType, service); |
| 442 } | 437 } |
| 443 | 438 |
| 444 // Cache these, they don't ever change per service. | 439 // Cache these, they don't ever change per service. |
| 445 if (AVAILABLE_LOCALES[service] === undefined) { | 440 if (AVAILABLE_LOCALES[service] === undefined) { |
| 446 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); | 441 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); |
| 447 } | 442 } |
| 448 | 443 |
| 449 for (var i = 0; i < requestedLocales.length; ++i) { | 444 for (var i = 0; i < requestedLocales.length; ++i) { |
| 450 // Remove all extensions. | 445 // Remove all extensions. |
| 451 var locale = requestedLocales[i].replace(GetAnyExtensionRE(), ''); | 446 var locale = requestedLocales[i].replace(GetAnyExtensionRE(), ''); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase(); | 699 return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase(); |
| 705 } | 700 } |
| 706 | 701 |
| 707 /** | 702 /** |
| 708 * Canonicalizes the language tag, or throws in case the tag is invalid. | 703 * Canonicalizes the language tag, or throws in case the tag is invalid. |
| 709 */ | 704 */ |
| 710 function canonicalizeLanguageTag(localeID) { | 705 function canonicalizeLanguageTag(localeID) { |
| 711 // null is typeof 'object' so we have to do extra check. | 706 // null is typeof 'object' so we have to do extra check. |
| 712 if (typeof localeID !== 'string' && typeof localeID !== 'object' || | 707 if (typeof localeID !== 'string' && typeof localeID !== 'object' || |
| 713 IS_NULL(localeID)) { | 708 IS_NULL(localeID)) { |
| 714 throw new $TypeError('Language ID should be string or object.'); | 709 throw MakeTypeError(kLanguageID); |
| 715 } | 710 } |
| 716 | 711 |
| 717 var localeString = GlobalString(localeID); | 712 var localeString = GlobalString(localeID); |
| 718 | 713 |
| 719 if (isValidLanguageTag(localeString) === false) { | 714 if (isValidLanguageTag(localeString) === false) { |
| 720 throw new $RangeError('Invalid language tag: ' + localeString); | 715 throw MakeRangeError(kInvalidLanguageTag, localeString); |
| 721 } | 716 } |
| 722 | 717 |
| 723 // This call will strip -kn but not -kn-true extensions. | 718 // This call will strip -kn but not -kn-true extensions. |
| 724 // ICU bug filled - http://bugs.icu-project.org/trac/ticket/9265. | 719 // ICU bug filled - http://bugs.icu-project.org/trac/ticket/9265. |
| 725 // TODO(cira): check if -u-kn-true-kc-true-kh-true still throws after | 720 // TODO(cira): check if -u-kn-true-kc-true-kh-true still throws after |
| 726 // upgrade to ICU 4.9. | 721 // upgrade to ICU 4.9. |
| 727 var tag = %CanonicalizeLanguageTag(localeString); | 722 var tag = %CanonicalizeLanguageTag(localeString); |
| 728 if (tag === 'invalid-tag') { | 723 if (tag === 'invalid-tag') { |
| 729 throw new $RangeError('Invalid language tag: ' + localeString); | 724 throw MakeRangeError(kInvalidLanguageTag, localeString); |
| 730 } | 725 } |
| 731 | 726 |
| 732 return tag; | 727 return tag; |
| 733 } | 728 } |
| 734 | 729 |
| 735 | 730 |
| 736 /** | 731 /** |
| 737 * Returns an array where all locales are canonicalized and duplicates removed. | 732 * Returns an array where all locales are canonicalized and duplicates removed. |
| 738 * Throws on locales that are not well formed BCP47 tags. | 733 * Throws on locales that are not well formed BCP47 tags. |
| 739 */ | 734 */ |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 '^(' + langTag + '|' + privateUse + '|' + grandfathered + ')$'; | 857 '^(' + langTag + '|' + privateUse + '|' + grandfathered + ')$'; |
| 863 LANGUAGE_TAG_RE = new GlobalRegExp(languageTag, 'i'); | 858 LANGUAGE_TAG_RE = new GlobalRegExp(languageTag, 'i'); |
| 864 } | 859 } |
| 865 | 860 |
| 866 /** | 861 /** |
| 867 * Initializes the given object so it's a valid Collator instance. | 862 * Initializes the given object so it's a valid Collator instance. |
| 868 * Useful for subclassing. | 863 * Useful for subclassing. |
| 869 */ | 864 */ |
| 870 function initializeCollator(collator, locales, options) { | 865 function initializeCollator(collator, locales, options) { |
| 871 if (%IsInitializedIntlObject(collator)) { | 866 if (%IsInitializedIntlObject(collator)) { |
| 872 throw new $TypeError('Trying to re-initialize Collator object.'); | 867 throw MakeTypeError(kReinitializeIntl, "Collator"); |
| 873 } | 868 } |
| 874 | 869 |
| 875 if (options === undefined) { | 870 if (options === undefined) { |
| 876 options = {}; | 871 options = {}; |
| 877 } | 872 } |
| 878 | 873 |
| 879 var getOption = getGetOption(options, 'collator'); | 874 var getOption = getGetOption(options, 'collator'); |
| 880 | 875 |
| 881 var internalOptions = {}; | 876 var internalOptions = {}; |
| 882 | 877 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 }, | 960 }, |
| 966 DONT_ENUM | 961 DONT_ENUM |
| 967 ); | 962 ); |
| 968 | 963 |
| 969 | 964 |
| 970 /** | 965 /** |
| 971 * Collator resolvedOptions method. | 966 * Collator resolvedOptions method. |
| 972 */ | 967 */ |
| 973 %AddNamedProperty(Intl.Collator.prototype, 'resolvedOptions', function() { | 968 %AddNamedProperty(Intl.Collator.prototype, 'resolvedOptions', function() { |
| 974 if (%_IsConstructCall()) { | 969 if (%_IsConstructCall()) { |
| 975 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 970 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 976 } | 971 } |
| 977 | 972 |
| 978 if (!%IsInitializedIntlObjectOfType(this, 'collator')) { | 973 if (!%IsInitializedIntlObjectOfType(this, 'collator')) { |
| 979 throw new $TypeError('resolvedOptions method called on a non-object ' + | 974 throw MakeTypeError(kResolvedOptionsCalledOnNonObject, "Collator"); |
| 980 'or on a object that is not Intl.Collator.'); | |
| 981 } | 975 } |
| 982 | 976 |
| 983 var coll = this; | 977 var coll = this; |
| 984 var locale = getOptimalLanguageTag(coll.resolved.requestedLocale, | 978 var locale = getOptimalLanguageTag(coll.resolved.requestedLocale, |
| 985 coll.resolved.locale); | 979 coll.resolved.locale); |
| 986 | 980 |
| 987 return { | 981 return { |
| 988 locale: locale, | 982 locale: locale, |
| 989 usage: coll.resolved.usage, | 983 usage: coll.resolved.usage, |
| 990 sensitivity: coll.resolved.sensitivity, | 984 sensitivity: coll.resolved.sensitivity, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1002 | 996 |
| 1003 | 997 |
| 1004 /** | 998 /** |
| 1005 * Returns the subset of the given locale list for which this locale list | 999 * Returns the subset of the given locale list for which this locale list |
| 1006 * has a matching (possibly fallback) locale. Locales appear in the same | 1000 * has a matching (possibly fallback) locale. Locales appear in the same |
| 1007 * order in the returned list as in the input list. | 1001 * order in the returned list as in the input list. |
| 1008 * Options are optional parameter. | 1002 * Options are optional parameter. |
| 1009 */ | 1003 */ |
| 1010 %AddNamedProperty(Intl.Collator, 'supportedLocalesOf', function(locales) { | 1004 %AddNamedProperty(Intl.Collator, 'supportedLocalesOf', function(locales) { |
| 1011 if (%_IsConstructCall()) { | 1005 if (%_IsConstructCall()) { |
| 1012 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1006 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1013 } | 1007 } |
| 1014 | 1008 |
| 1015 return supportedLocalesOf('collator', locales, %_Arguments(1)); | 1009 return supportedLocalesOf('collator', locales, %_Arguments(1)); |
| 1016 }, | 1010 }, |
| 1017 DONT_ENUM | 1011 DONT_ENUM |
| 1018 ); | 1012 ); |
| 1019 %FunctionSetName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); | 1013 %FunctionSetName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); |
| 1020 %FunctionRemovePrototype(Intl.Collator.supportedLocalesOf); | 1014 %FunctionRemovePrototype(Intl.Collator.supportedLocalesOf); |
| 1021 %SetNativeFlag(Intl.Collator.supportedLocalesOf); | 1015 %SetNativeFlag(Intl.Collator.supportedLocalesOf); |
| 1022 | 1016 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1053 | 1047 |
| 1054 /** | 1048 /** |
| 1055 * Returns the valid digit count for a property, or throws RangeError on | 1049 * Returns the valid digit count for a property, or throws RangeError on |
| 1056 * a value out of the range. | 1050 * a value out of the range. |
| 1057 */ | 1051 */ |
| 1058 function getNumberOption(options, property, min, max, fallback) { | 1052 function getNumberOption(options, property, min, max, fallback) { |
| 1059 var value = options[property]; | 1053 var value = options[property]; |
| 1060 if (value !== undefined) { | 1054 if (value !== undefined) { |
| 1061 value = GlobalNumber(value); | 1055 value = GlobalNumber(value); |
| 1062 if ($isNaN(value) || value < min || value > max) { | 1056 if ($isNaN(value) || value < min || value > max) { |
| 1063 throw new $RangeError(property + ' value is out of range.'); | 1057 throw MakeRangeError(kPropertyValueOutOfRange, property); |
| 1064 } | 1058 } |
| 1065 return $floor(value); | 1059 return $floor(value); |
| 1066 } | 1060 } |
| 1067 | 1061 |
| 1068 return fallback; | 1062 return fallback; |
| 1069 } | 1063 } |
| 1070 | 1064 |
| 1071 | 1065 |
| 1072 /** | 1066 /** |
| 1073 * Initializes the given object so it's a valid NumberFormat instance. | 1067 * Initializes the given object so it's a valid NumberFormat instance. |
| 1074 * Useful for subclassing. | 1068 * Useful for subclassing. |
| 1075 */ | 1069 */ |
| 1076 function initializeNumberFormat(numberFormat, locales, options) { | 1070 function initializeNumberFormat(numberFormat, locales, options) { |
| 1077 if (%IsInitializedIntlObject(numberFormat)) { | 1071 if (%IsInitializedIntlObject(numberFormat)) { |
| 1078 throw new $TypeError('Trying to re-initialize NumberFormat object.'); | 1072 throw MakeTypeError(kReinitializeIntl, "NumberFormat"); |
| 1079 } | 1073 } |
| 1080 | 1074 |
| 1081 if (options === undefined) { | 1075 if (options === undefined) { |
| 1082 options = {}; | 1076 options = {}; |
| 1083 } | 1077 } |
| 1084 | 1078 |
| 1085 var getOption = getGetOption(options, 'numberformat'); | 1079 var getOption = getGetOption(options, 'numberformat'); |
| 1086 | 1080 |
| 1087 var locale = resolveLocale('numberformat', locales, options); | 1081 var locale = resolveLocale('numberformat', locales, options); |
| 1088 | 1082 |
| 1089 var internalOptions = {}; | 1083 var internalOptions = {}; |
| 1090 defineWEProperty(internalOptions, 'style', getOption( | 1084 defineWEProperty(internalOptions, 'style', getOption( |
| 1091 'style', 'string', ['decimal', 'percent', 'currency'], 'decimal')); | 1085 'style', 'string', ['decimal', 'percent', 'currency'], 'decimal')); |
| 1092 | 1086 |
| 1093 var currency = getOption('currency', 'string'); | 1087 var currency = getOption('currency', 'string'); |
| 1094 if (currency !== undefined && !isWellFormedCurrencyCode(currency)) { | 1088 if (currency !== undefined && !isWellFormedCurrencyCode(currency)) { |
| 1095 throw new $RangeError('Invalid currency code: ' + currency); | 1089 throw MakeRangeError(kInvalidCurrencyCode, currency); |
| 1096 } | 1090 } |
| 1097 | 1091 |
| 1098 if (internalOptions.style === 'currency' && currency === undefined) { | 1092 if (internalOptions.style === 'currency' && currency === undefined) { |
| 1099 throw new $TypeError('Currency code is required with currency style.'); | 1093 throw MakeTypeError(kCurrencyCode); |
| 1100 } | 1094 } |
| 1101 | 1095 |
| 1102 var currencyDisplay = getOption( | 1096 var currencyDisplay = getOption( |
| 1103 'currencyDisplay', 'string', ['code', 'symbol', 'name'], 'symbol'); | 1097 'currencyDisplay', 'string', ['code', 'symbol', 'name'], 'symbol'); |
| 1104 if (internalOptions.style === 'currency') { | 1098 if (internalOptions.style === 'currency') { |
| 1105 defineWEProperty(internalOptions, 'currency', currency.toUpperCase()); | 1099 defineWEProperty(internalOptions, 'currency', currency.toUpperCase()); |
| 1106 defineWEProperty(internalOptions, 'currencyDisplay', currencyDisplay); | 1100 defineWEProperty(internalOptions, 'currencyDisplay', currencyDisplay); |
| 1107 } | 1101 } |
| 1108 | 1102 |
| 1109 // Digit ranges. | 1103 // Digit ranges. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1192 }, | 1186 }, |
| 1193 DONT_ENUM | 1187 DONT_ENUM |
| 1194 ); | 1188 ); |
| 1195 | 1189 |
| 1196 | 1190 |
| 1197 /** | 1191 /** |
| 1198 * NumberFormat resolvedOptions method. | 1192 * NumberFormat resolvedOptions method. |
| 1199 */ | 1193 */ |
| 1200 %AddNamedProperty(Intl.NumberFormat.prototype, 'resolvedOptions', function() { | 1194 %AddNamedProperty(Intl.NumberFormat.prototype, 'resolvedOptions', function() { |
| 1201 if (%_IsConstructCall()) { | 1195 if (%_IsConstructCall()) { |
| 1202 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1196 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1203 } | 1197 } |
| 1204 | 1198 |
| 1205 if (!%IsInitializedIntlObjectOfType(this, 'numberformat')) { | 1199 if (!%IsInitializedIntlObjectOfType(this, 'numberformat')) { |
| 1206 throw new $TypeError('resolvedOptions method called on a non-object' + | 1200 throw MakeTypeError(kResolvedOptionsCalledOnNonObject, "NumberFormat"); |
| 1207 ' or on a object that is not Intl.NumberFormat.'); | |
| 1208 } | 1201 } |
| 1209 | 1202 |
| 1210 var format = this; | 1203 var format = this; |
| 1211 var locale = getOptimalLanguageTag(format.resolved.requestedLocale, | 1204 var locale = getOptimalLanguageTag(format.resolved.requestedLocale, |
| 1212 format.resolved.locale); | 1205 format.resolved.locale); |
| 1213 | 1206 |
| 1214 var result = { | 1207 var result = { |
| 1215 locale: locale, | 1208 locale: locale, |
| 1216 numberingSystem: format.resolved.numberingSystem, | 1209 numberingSystem: format.resolved.numberingSystem, |
| 1217 style: format.resolved.style, | 1210 style: format.resolved.style, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1248 | 1241 |
| 1249 | 1242 |
| 1250 /** | 1243 /** |
| 1251 * Returns the subset of the given locale list for which this locale list | 1244 * Returns the subset of the given locale list for which this locale list |
| 1252 * has a matching (possibly fallback) locale. Locales appear in the same | 1245 * has a matching (possibly fallback) locale. Locales appear in the same |
| 1253 * order in the returned list as in the input list. | 1246 * order in the returned list as in the input list. |
| 1254 * Options are optional parameter. | 1247 * Options are optional parameter. |
| 1255 */ | 1248 */ |
| 1256 %AddNamedProperty(Intl.NumberFormat, 'supportedLocalesOf', function(locales) { | 1249 %AddNamedProperty(Intl.NumberFormat, 'supportedLocalesOf', function(locales) { |
| 1257 if (%_IsConstructCall()) { | 1250 if (%_IsConstructCall()) { |
| 1258 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1251 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1259 } | 1252 } |
| 1260 | 1253 |
| 1261 return supportedLocalesOf('numberformat', locales, %_Arguments(1)); | 1254 return supportedLocalesOf('numberformat', locales, %_Arguments(1)); |
| 1262 }, | 1255 }, |
| 1263 DONT_ENUM | 1256 DONT_ENUM |
| 1264 ); | 1257 ); |
| 1265 %FunctionSetName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); | 1258 %FunctionSetName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); |
| 1266 %FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf); | 1259 %FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf); |
| 1267 %SetNativeFlag(Intl.NumberFormat.supportedLocalesOf); | 1260 %SetNativeFlag(Intl.NumberFormat.supportedLocalesOf); |
| 1268 | 1261 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1491 } | 1484 } |
| 1492 | 1485 |
| 1493 | 1486 |
| 1494 /** | 1487 /** |
| 1495 * Initializes the given object so it's a valid DateTimeFormat instance. | 1488 * Initializes the given object so it's a valid DateTimeFormat instance. |
| 1496 * Useful for subclassing. | 1489 * Useful for subclassing. |
| 1497 */ | 1490 */ |
| 1498 function initializeDateTimeFormat(dateFormat, locales, options) { | 1491 function initializeDateTimeFormat(dateFormat, locales, options) { |
| 1499 | 1492 |
| 1500 if (%IsInitializedIntlObject(dateFormat)) { | 1493 if (%IsInitializedIntlObject(dateFormat)) { |
| 1501 throw new $TypeError('Trying to re-initialize DateTimeFormat object.'); | 1494 throw MakeTypeError(kReinitializeIntl, "DateTimeFormat"); |
| 1502 } | 1495 } |
| 1503 | 1496 |
| 1504 if (options === undefined) { | 1497 if (options === undefined) { |
| 1505 options = {}; | 1498 options = {}; |
| 1506 } | 1499 } |
| 1507 | 1500 |
| 1508 var locale = resolveLocale('dateformat', locales, options); | 1501 var locale = resolveLocale('dateformat', locales, options); |
| 1509 | 1502 |
| 1510 options = toDateTimeOptions(options, 'any', 'date'); | 1503 options = toDateTimeOptions(options, 'any', 'date'); |
| 1511 | 1504 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 timeZoneName: {writable: true}, | 1542 timeZoneName: {writable: true}, |
| 1550 tz: {value: tz, writable: true}, | 1543 tz: {value: tz, writable: true}, |
| 1551 weekday: {writable: true}, | 1544 weekday: {writable: true}, |
| 1552 year: {writable: true} | 1545 year: {writable: true} |
| 1553 }); | 1546 }); |
| 1554 | 1547 |
| 1555 var formatter = %CreateDateTimeFormat( | 1548 var formatter = %CreateDateTimeFormat( |
| 1556 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); | 1549 requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); |
| 1557 | 1550 |
| 1558 if (tz !== undefined && tz !== resolved.timeZone) { | 1551 if (tz !== undefined && tz !== resolved.timeZone) { |
| 1559 throw new $RangeError('Unsupported time zone specified ' + tz); | 1552 throw MakeRangeError(kUnsupportedTimeZone, tz); |
| 1560 } | 1553 } |
| 1561 | 1554 |
| 1562 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); | 1555 %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); |
| 1563 ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); | 1556 ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
| 1564 | 1557 |
| 1565 return dateFormat; | 1558 return dateFormat; |
| 1566 } | 1559 } |
| 1567 | 1560 |
| 1568 | 1561 |
| 1569 /** | 1562 /** |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1585 }, | 1578 }, |
| 1586 DONT_ENUM | 1579 DONT_ENUM |
| 1587 ); | 1580 ); |
| 1588 | 1581 |
| 1589 | 1582 |
| 1590 /** | 1583 /** |
| 1591 * DateTimeFormat resolvedOptions method. | 1584 * DateTimeFormat resolvedOptions method. |
| 1592 */ | 1585 */ |
| 1593 %AddNamedProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', function() { | 1586 %AddNamedProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', function() { |
| 1594 if (%_IsConstructCall()) { | 1587 if (%_IsConstructCall()) { |
| 1595 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1588 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1596 } | 1589 } |
| 1597 | 1590 |
| 1598 if (!%IsInitializedIntlObjectOfType(this, 'dateformat')) { | 1591 if (!%IsInitializedIntlObjectOfType(this, 'dateformat')) { |
| 1599 throw new $TypeError('resolvedOptions method called on a non-object or ' + | 1592 throw MakeTypeError(kResolvedOptionsCalledOnNonObject, "DateTimeFormat"); |
| 1600 'on a object that is not Intl.DateTimeFormat.'); | |
| 1601 } | 1593 } |
| 1602 | 1594 |
| 1603 var format = this; | 1595 var format = this; |
| 1604 var fromPattern = fromLDMLString(format.resolved.pattern); | 1596 var fromPattern = fromLDMLString(format.resolved.pattern); |
| 1605 var userCalendar = ICU_CALENDAR_MAP[format.resolved.calendar]; | 1597 var userCalendar = ICU_CALENDAR_MAP[format.resolved.calendar]; |
| 1606 if (userCalendar === undefined) { | 1598 if (userCalendar === undefined) { |
| 1607 // Use ICU name if we don't have a match. It shouldn't happen, but | 1599 // Use ICU name if we don't have a match. It shouldn't happen, but |
| 1608 // it would be too strict to throw for this. | 1600 // it would be too strict to throw for this. |
| 1609 userCalendar = format.resolved.calendar; | 1601 userCalendar = format.resolved.calendar; |
| 1610 } | 1602 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1641 | 1633 |
| 1642 | 1634 |
| 1643 /** | 1635 /** |
| 1644 * Returns the subset of the given locale list for which this locale list | 1636 * Returns the subset of the given locale list for which this locale list |
| 1645 * has a matching (possibly fallback) locale. Locales appear in the same | 1637 * has a matching (possibly fallback) locale. Locales appear in the same |
| 1646 * order in the returned list as in the input list. | 1638 * order in the returned list as in the input list. |
| 1647 * Options are optional parameter. | 1639 * Options are optional parameter. |
| 1648 */ | 1640 */ |
| 1649 %AddNamedProperty(Intl.DateTimeFormat, 'supportedLocalesOf', function(locales) { | 1641 %AddNamedProperty(Intl.DateTimeFormat, 'supportedLocalesOf', function(locales) { |
| 1650 if (%_IsConstructCall()) { | 1642 if (%_IsConstructCall()) { |
| 1651 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1643 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1652 } | 1644 } |
| 1653 | 1645 |
| 1654 return supportedLocalesOf('dateformat', locales, %_Arguments(1)); | 1646 return supportedLocalesOf('dateformat', locales, %_Arguments(1)); |
| 1655 }, | 1647 }, |
| 1656 DONT_ENUM | 1648 DONT_ENUM |
| 1657 ); | 1649 ); |
| 1658 %FunctionSetName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); | 1650 %FunctionSetName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); |
| 1659 %FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf); | 1651 %FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf); |
| 1660 %SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf); | 1652 %SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf); |
| 1661 | 1653 |
| 1662 | 1654 |
| 1663 /** | 1655 /** |
| 1664 * Returns a String value representing the result of calling ToNumber(date) | 1656 * Returns a String value representing the result of calling ToNumber(date) |
| 1665 * according to the effective locale and the formatting options of this | 1657 * according to the effective locale and the formatting options of this |
| 1666 * DateTimeFormat. | 1658 * DateTimeFormat. |
| 1667 */ | 1659 */ |
| 1668 function formatDate(formatter, dateValue) { | 1660 function formatDate(formatter, dateValue) { |
| 1669 var dateMs; | 1661 var dateMs; |
| 1670 if (dateValue === undefined) { | 1662 if (dateValue === undefined) { |
| 1671 dateMs = GlobalDate.now(); | 1663 dateMs = GlobalDate.now(); |
| 1672 } else { | 1664 } else { |
| 1673 dateMs = GlobalNumber(dateValue); | 1665 dateMs = GlobalNumber(dateValue); |
| 1674 } | 1666 } |
| 1675 | 1667 |
| 1676 if (!$isFinite(dateMs)) { | 1668 if (!$isFinite(dateMs)) throw MakeRangeError(kDateRange); |
| 1677 throw new $RangeError('Provided date is not in valid range.'); | |
| 1678 } | |
| 1679 | 1669 |
| 1680 return %InternalDateFormat(%GetImplFromInitializedIntlObject(formatter), | 1670 return %InternalDateFormat(%GetImplFromInitializedIntlObject(formatter), |
| 1681 new GlobalDate(dateMs)); | 1671 new GlobalDate(dateMs)); |
| 1682 } | 1672 } |
| 1683 | 1673 |
| 1684 | 1674 |
| 1685 /** | 1675 /** |
| 1686 * Returns a Date object representing the result of calling ToString(value) | 1676 * Returns a Date object representing the result of calling ToString(value) |
| 1687 * according to the effective locale and the formatting options of this | 1677 * according to the effective locale and the formatting options of this |
| 1688 * DateTimeFormat. | 1678 * DateTimeFormat. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1712 // Special case handling (UTC, GMT). | 1702 // Special case handling (UTC, GMT). |
| 1713 var upperID = tzID.toUpperCase(); | 1703 var upperID = tzID.toUpperCase(); |
| 1714 if (upperID === 'UTC' || upperID === 'GMT' || | 1704 if (upperID === 'UTC' || upperID === 'GMT' || |
| 1715 upperID === 'ETC/UTC' || upperID === 'ETC/GMT') { | 1705 upperID === 'ETC/UTC' || upperID === 'ETC/GMT') { |
| 1716 return 'UTC'; | 1706 return 'UTC'; |
| 1717 } | 1707 } |
| 1718 | 1708 |
| 1719 // We expect only _ and / beside ASCII letters. | 1709 // We expect only _ and / beside ASCII letters. |
| 1720 // All inputs should conform to Area/Location from now on. | 1710 // All inputs should conform to Area/Location from now on. |
| 1721 var match = GetTimezoneNameCheckRE().exec(tzID); | 1711 var match = GetTimezoneNameCheckRE().exec(tzID); |
| 1722 if (IS_NULL(match)) { | 1712 if (IS_NULL(match)) throw MakeRangeError(kExpectedLocation, tzID); |
| 1723 throw new $RangeError('Expected Area/Location for time zone, got ' + tzID); | |
| 1724 } | |
| 1725 | 1713 |
| 1726 var result = toTitleCaseWord(match[1]) + '/' + toTitleCaseWord(match[2]); | 1714 var result = toTitleCaseWord(match[1]) + '/' + toTitleCaseWord(match[2]); |
| 1727 var i = 3; | 1715 var i = 3; |
| 1728 while (match[i] !== undefined && i < match.length) { | 1716 while (match[i] !== undefined && i < match.length) { |
| 1729 result = result + '_' + toTitleCaseWord(match[i]); | 1717 result = result + '_' + toTitleCaseWord(match[i]); |
| 1730 i++; | 1718 i++; |
| 1731 } | 1719 } |
| 1732 | 1720 |
| 1733 return result; | 1721 return result; |
| 1734 } | 1722 } |
| 1735 | 1723 |
| 1736 /** | 1724 /** |
| 1737 * Initializes the given object so it's a valid BreakIterator instance. | 1725 * Initializes the given object so it's a valid BreakIterator instance. |
| 1738 * Useful for subclassing. | 1726 * Useful for subclassing. |
| 1739 */ | 1727 */ |
| 1740 function initializeBreakIterator(iterator, locales, options) { | 1728 function initializeBreakIterator(iterator, locales, options) { |
| 1741 if (%IsInitializedIntlObject(iterator)) { | 1729 if (%IsInitializedIntlObject(iterator)) { |
| 1742 throw new $TypeError('Trying to re-initialize v8BreakIterator object.'); | 1730 throw MakeTypeError(kReinitializeIntl, "v8BreakIterator"); |
| 1743 } | 1731 } |
| 1744 | 1732 |
| 1745 if (options === undefined) { | 1733 if (options === undefined) { |
| 1746 options = {}; | 1734 options = {}; |
| 1747 } | 1735 } |
| 1748 | 1736 |
| 1749 var getOption = getGetOption(options, 'breakiterator'); | 1737 var getOption = getGetOption(options, 'breakiterator'); |
| 1750 | 1738 |
| 1751 var internalOptions = {}; | 1739 var internalOptions = {}; |
| 1752 | 1740 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1792 DONT_ENUM | 1780 DONT_ENUM |
| 1793 ); | 1781 ); |
| 1794 | 1782 |
| 1795 | 1783 |
| 1796 /** | 1784 /** |
| 1797 * BreakIterator resolvedOptions method. | 1785 * BreakIterator resolvedOptions method. |
| 1798 */ | 1786 */ |
| 1799 %AddNamedProperty(Intl.v8BreakIterator.prototype, 'resolvedOptions', | 1787 %AddNamedProperty(Intl.v8BreakIterator.prototype, 'resolvedOptions', |
| 1800 function() { | 1788 function() { |
| 1801 if (%_IsConstructCall()) { | 1789 if (%_IsConstructCall()) { |
| 1802 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1790 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1803 } | 1791 } |
| 1804 | 1792 |
| 1805 if (!%IsInitializedIntlObjectOfType(this, 'breakiterator')) { | 1793 if (!%IsInitializedIntlObjectOfType(this, 'breakiterator')) { |
| 1806 throw new $TypeError('resolvedOptions method called on a non-object or ' + | 1794 throw MakeTypeError(kResolvedOptionsCalledOnNonObject, "v8BreakIterator"); |
| 1807 'on a object that is not Intl.v8BreakIterator.'); | |
| 1808 } | 1795 } |
| 1809 | 1796 |
| 1810 var segmenter = this; | 1797 var segmenter = this; |
| 1811 var locale = getOptimalLanguageTag(segmenter.resolved.requestedLocale, | 1798 var locale = getOptimalLanguageTag(segmenter.resolved.requestedLocale, |
| 1812 segmenter.resolved.locale); | 1799 segmenter.resolved.locale); |
| 1813 | 1800 |
| 1814 return { | 1801 return { |
| 1815 locale: locale, | 1802 locale: locale, |
| 1816 type: segmenter.resolved.type | 1803 type: segmenter.resolved.type |
| 1817 }; | 1804 }; |
| 1818 }, | 1805 }, |
| 1819 DONT_ENUM | 1806 DONT_ENUM |
| 1820 ); | 1807 ); |
| 1821 %FunctionSetName(Intl.v8BreakIterator.prototype.resolvedOptions, | 1808 %FunctionSetName(Intl.v8BreakIterator.prototype.resolvedOptions, |
| 1822 'resolvedOptions'); | 1809 'resolvedOptions'); |
| 1823 %FunctionRemovePrototype(Intl.v8BreakIterator.prototype.resolvedOptions); | 1810 %FunctionRemovePrototype(Intl.v8BreakIterator.prototype.resolvedOptions); |
| 1824 %SetNativeFlag(Intl.v8BreakIterator.prototype.resolvedOptions); | 1811 %SetNativeFlag(Intl.v8BreakIterator.prototype.resolvedOptions); |
| 1825 | 1812 |
| 1826 | 1813 |
| 1827 /** | 1814 /** |
| 1828 * Returns the subset of the given locale list for which this locale list | 1815 * Returns the subset of the given locale list for which this locale list |
| 1829 * has a matching (possibly fallback) locale. Locales appear in the same | 1816 * has a matching (possibly fallback) locale. Locales appear in the same |
| 1830 * order in the returned list as in the input list. | 1817 * order in the returned list as in the input list. |
| 1831 * Options are optional parameter. | 1818 * Options are optional parameter. |
| 1832 */ | 1819 */ |
| 1833 %AddNamedProperty(Intl.v8BreakIterator, 'supportedLocalesOf', | 1820 %AddNamedProperty(Intl.v8BreakIterator, 'supportedLocalesOf', |
| 1834 function(locales) { | 1821 function(locales) { |
| 1835 if (%_IsConstructCall()) { | 1822 if (%_IsConstructCall()) { |
| 1836 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1823 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1837 } | 1824 } |
| 1838 | 1825 |
| 1839 return supportedLocalesOf('breakiterator', locales, %_Arguments(1)); | 1826 return supportedLocalesOf('breakiterator', locales, %_Arguments(1)); |
| 1840 }, | 1827 }, |
| 1841 DONT_ENUM | 1828 DONT_ENUM |
| 1842 ); | 1829 ); |
| 1843 %FunctionSetName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); | 1830 %FunctionSetName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); |
| 1844 %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); | 1831 %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); |
| 1845 %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); | 1832 %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); |
| 1846 | 1833 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1929 return new savedObjects[service](locales, useOptions); | 1916 return new savedObjects[service](locales, useOptions); |
| 1930 } | 1917 } |
| 1931 | 1918 |
| 1932 | 1919 |
| 1933 /** | 1920 /** |
| 1934 * Compares this and that, and returns less than 0, 0 or greater than 0 value. | 1921 * Compares this and that, and returns less than 0, 0 or greater than 0 value. |
| 1935 * Overrides the built-in method. | 1922 * Overrides the built-in method. |
| 1936 */ | 1923 */ |
| 1937 OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { | 1924 OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { |
| 1938 if (%_IsConstructCall()) { | 1925 if (%_IsConstructCall()) { |
| 1939 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1926 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1940 } | 1927 } |
| 1941 | 1928 |
| 1942 if (IS_NULL_OR_UNDEFINED(this)) { | 1929 if (IS_NULL_OR_UNDEFINED(this)) { |
| 1943 throw new $TypeError('Method invoked on undefined or null value.'); | 1930 throw MakeTypeError(kMethodInvokedOnNullOrUndefined); |
| 1944 } | 1931 } |
| 1945 | 1932 |
| 1946 var locales = %_Arguments(1); | 1933 var locales = %_Arguments(1); |
| 1947 var options = %_Arguments(2); | 1934 var options = %_Arguments(2); |
| 1948 var collator = cachedOrNewService('collator', locales, options); | 1935 var collator = cachedOrNewService('collator', locales, options); |
| 1949 return compare(collator, this, that); | 1936 return compare(collator, this, that); |
| 1950 } | 1937 } |
| 1951 ); | 1938 ); |
| 1952 | 1939 |
| 1953 | 1940 |
| 1954 /** | 1941 /** |
| 1955 * Unicode normalization. This method is called with one argument that | 1942 * Unicode normalization. This method is called with one argument that |
| 1956 * specifies the normalization form. | 1943 * specifies the normalization form. |
| 1957 * If none is specified, "NFC" is assumed. | 1944 * If none is specified, "NFC" is assumed. |
| 1958 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw | 1945 * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw |
| 1959 * a RangeError Exception. | 1946 * a RangeError Exception. |
| 1960 */ | 1947 */ |
| 1961 OverrideFunction(GlobalString.prototype, 'normalize', function(that) { | 1948 OverrideFunction(GlobalString.prototype, 'normalize', function(that) { |
| 1962 if (%_IsConstructCall()) { | 1949 if (%_IsConstructCall()) { |
| 1963 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1950 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1964 } | 1951 } |
| 1965 | 1952 |
| 1966 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 1953 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
| 1967 | 1954 |
| 1968 var form = GlobalString(%_Arguments(0) || 'NFC'); | 1955 var form = GlobalString(%_Arguments(0) || 'NFC'); |
| 1969 | 1956 |
| 1970 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); | 1957 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); |
| 1971 if (normalizationForm === -1) { | 1958 if (normalizationForm === -1) { |
| 1972 throw new $RangeError('The normalization form should be one of ' | 1959 throw MakeRangeError(kNormalizationForm, NORMALIZATION_FORMS.join(', ')); |
| 1973 + NORMALIZATION_FORMS.join(', ') + '.'); | |
| 1974 } | 1960 } |
| 1975 | 1961 |
| 1976 return %StringNormalize(this, normalizationForm); | 1962 return %StringNormalize(this, normalizationForm); |
| 1977 } | 1963 } |
| 1978 ); | 1964 ); |
| 1979 | 1965 |
| 1980 | 1966 |
| 1981 /** | 1967 /** |
| 1982 * Formats a Number object (this) using locale and options values. | 1968 * Formats a Number object (this) using locale and options values. |
| 1983 * If locale or options are omitted, defaults are used. | 1969 * If locale or options are omitted, defaults are used. |
| 1984 */ | 1970 */ |
| 1985 OverrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { | 1971 OverrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { |
| 1986 if (%_IsConstructCall()) { | 1972 if (%_IsConstructCall()) { |
| 1987 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1973 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 1988 } | 1974 } |
| 1989 | 1975 |
| 1990 if (!(this instanceof GlobalNumber) && typeof(this) !== 'number') { | 1976 if (!(this instanceof GlobalNumber) && typeof(this) !== 'number') { |
| 1991 throw new $TypeError('Method invoked on an object that is not Number.'); | 1977 throw MakeTypeError(kMethodInvokedOnWrongType, "Number"); |
| 1992 } | 1978 } |
| 1993 | 1979 |
| 1994 var locales = %_Arguments(0); | 1980 var locales = %_Arguments(0); |
| 1995 var options = %_Arguments(1); | 1981 var options = %_Arguments(1); |
| 1996 var numberFormat = cachedOrNewService('numberformat', locales, options); | 1982 var numberFormat = cachedOrNewService('numberformat', locales, options); |
| 1997 return formatNumber(numberFormat, this); | 1983 return formatNumber(numberFormat, this); |
| 1998 } | 1984 } |
| 1999 ); | 1985 ); |
| 2000 | 1986 |
| 2001 | 1987 |
| 2002 /** | 1988 /** |
| 2003 * Returns actual formatted date or fails if date parameter is invalid. | 1989 * Returns actual formatted date or fails if date parameter is invalid. |
| 2004 */ | 1990 */ |
| 2005 function toLocaleDateTime(date, locales, options, required, defaults, service) { | 1991 function toLocaleDateTime(date, locales, options, required, defaults, service) { |
| 2006 if (!(date instanceof GlobalDate)) { | 1992 if (!(date instanceof GlobalDate)) { |
| 2007 throw new $TypeError('Method invoked on an object that is not Date.'); | 1993 throw MakeTypeError(kMethodInvokedOnWrongType, "Date"); |
| 2008 } | 1994 } |
| 2009 | 1995 |
| 2010 if ($isNaN(date)) { | 1996 if ($isNaN(date)) { |
| 2011 return 'Invalid Date'; | 1997 return 'Invalid Date'; |
| 2012 } | 1998 } |
| 2013 | 1999 |
| 2014 var internalOptions = toDateTimeOptions(options, required, defaults); | 2000 var internalOptions = toDateTimeOptions(options, required, defaults); |
| 2015 | 2001 |
| 2016 var dateFormat = | 2002 var dateFormat = |
| 2017 cachedOrNewService(service, locales, options, internalOptions); | 2003 cachedOrNewService(service, locales, options, internalOptions); |
| 2018 | 2004 |
| 2019 return formatDate(dateFormat, date); | 2005 return formatDate(dateFormat, date); |
| 2020 } | 2006 } |
| 2021 | 2007 |
| 2022 | 2008 |
| 2023 /** | 2009 /** |
| 2024 * Formats a Date object (this) using locale and options values. | 2010 * Formats a Date object (this) using locale and options values. |
| 2025 * If locale or options are omitted, defaults are used - both date and time are | 2011 * If locale or options are omitted, defaults are used - both date and time are |
| 2026 * present in the output. | 2012 * present in the output. |
| 2027 */ | 2013 */ |
| 2028 OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { | 2014 OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { |
| 2029 if (%_IsConstructCall()) { | 2015 if (%_IsConstructCall()) { |
| 2030 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 2016 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 2031 } | 2017 } |
| 2032 | 2018 |
| 2033 var locales = %_Arguments(0); | 2019 var locales = %_Arguments(0); |
| 2034 var options = %_Arguments(1); | 2020 var options = %_Arguments(1); |
| 2035 return toLocaleDateTime( | 2021 return toLocaleDateTime( |
| 2036 this, locales, options, 'any', 'all', 'dateformatall'); | 2022 this, locales, options, 'any', 'all', 'dateformatall'); |
| 2037 } | 2023 } |
| 2038 ); | 2024 ); |
| 2039 | 2025 |
| 2040 | 2026 |
| 2041 /** | 2027 /** |
| 2042 * Formats a Date object (this) using locale and options values. | 2028 * Formats a Date object (this) using locale and options values. |
| 2043 * If locale or options are omitted, defaults are used - only date is present | 2029 * If locale or options are omitted, defaults are used - only date is present |
| 2044 * in the output. | 2030 * in the output. |
| 2045 */ | 2031 */ |
| 2046 OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { | 2032 OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { |
| 2047 if (%_IsConstructCall()) { | 2033 if (%_IsConstructCall()) { |
| 2048 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 2034 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 2049 } | 2035 } |
| 2050 | 2036 |
| 2051 var locales = %_Arguments(0); | 2037 var locales = %_Arguments(0); |
| 2052 var options = %_Arguments(1); | 2038 var options = %_Arguments(1); |
| 2053 return toLocaleDateTime( | 2039 return toLocaleDateTime( |
| 2054 this, locales, options, 'date', 'date', 'dateformatdate'); | 2040 this, locales, options, 'date', 'date', 'dateformatdate'); |
| 2055 } | 2041 } |
| 2056 ); | 2042 ); |
| 2057 | 2043 |
| 2058 | 2044 |
| 2059 /** | 2045 /** |
| 2060 * Formats a Date object (this) using locale and options values. | 2046 * Formats a Date object (this) using locale and options values. |
| 2061 * If locale or options are omitted, defaults are used - only time is present | 2047 * If locale or options are omitted, defaults are used - only time is present |
| 2062 * in the output. | 2048 * in the output. |
| 2063 */ | 2049 */ |
| 2064 OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { | 2050 OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { |
| 2065 if (%_IsConstructCall()) { | 2051 if (%_IsConstructCall()) { |
| 2066 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 2052 throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
| 2067 } | 2053 } |
| 2068 | 2054 |
| 2069 var locales = %_Arguments(0); | 2055 var locales = %_Arguments(0); |
| 2070 var options = %_Arguments(1); | 2056 var options = %_Arguments(1); |
| 2071 return toLocaleDateTime( | 2057 return toLocaleDateTime( |
| 2072 this, locales, options, 'time', 'time', 'dateformattime'); | 2058 this, locales, options, 'time', 'time', 'dateformattime'); |
| 2073 } | 2059 } |
| 2074 ); | 2060 ); |
| 2075 | 2061 |
| 2076 })(); | 2062 })(); |
| OLD | NEW |