Index: src/i18n.js |
diff --git a/src/i18n.js b/src/i18n.js |
index 94fe7d653e9dd78352b2ccf7f120c52c484c093c..81212b8476f6db1c223d2c5dd50334b74127c372 100644 |
--- a/src/i18n.js |
+++ b/src/i18n.js |
@@ -8,14 +8,11 @@ |
* Intl object is a single object that has some named properties, |
* all of which are constructors. |
*/ |
-(function(global, utils) { |
+(function(global, shared, exports) { |
"use strict"; |
%CheckIsBootstrapping(); |
- |
-// ------------------------------------------------------------------- |
-// Imports |
var GlobalBoolean = global.Boolean; |
var GlobalDate = global.Date; |
@@ -23,13 +20,7 @@ |
var GlobalRegExp = global.RegExp; |
var GlobalString = global.String; |
-var MathFloor; |
- |
-utils.Import(function(from) { |
- MathFloor = from.MathFloor; |
-}); |
- |
-// ------------------------------------------------------------------- |
+var undefined = global.undefined; |
var Intl = {}; |
@@ -39,24 +30,24 @@ |
* Caches available locales for each service. |
*/ |
var AVAILABLE_LOCALES = { |
- 'collator': UNDEFINED, |
- 'numberformat': UNDEFINED, |
- 'dateformat': UNDEFINED, |
- 'breakiterator': UNDEFINED |
+ 'collator': undefined, |
+ 'numberformat': undefined, |
+ 'dateformat': undefined, |
+ 'breakiterator': undefined |
}; |
/** |
* Caches default ICU locale. |
*/ |
-var DEFAULT_ICU_LOCALE = UNDEFINED; |
+var DEFAULT_ICU_LOCALE = undefined; |
/** |
* Unicode extension regular expression. |
*/ |
-var UNICODE_EXTENSION_RE = UNDEFINED; |
+var UNICODE_EXTENSION_RE = undefined; |
function GetUnicodeExtensionRE() { |
- if (IS_UNDEFINED(UNDEFINED)) { |
+ if (UNICODE_EXTENSION_RE === undefined) { |
UNICODE_EXTENSION_RE = new GlobalRegExp('-u(-[a-z0-9]{2,8})+', 'g'); |
} |
return UNICODE_EXTENSION_RE; |
@@ -65,10 +56,10 @@ |
/** |
* Matches any Unicode extension. |
*/ |
-var ANY_EXTENSION_RE = UNDEFINED; |
+var ANY_EXTENSION_RE = undefined; |
function GetAnyExtensionRE() { |
- if (IS_UNDEFINED(ANY_EXTENSION_RE)) { |
+ if (ANY_EXTENSION_RE === undefined) { |
ANY_EXTENSION_RE = new GlobalRegExp('-[a-z0-9]{1}-.*', 'g'); |
} |
return ANY_EXTENSION_RE; |
@@ -77,10 +68,10 @@ |
/** |
* Replace quoted text (single quote, anything but the quote and quote again). |
*/ |
-var QUOTED_STRING_RE = UNDEFINED; |
+var QUOTED_STRING_RE = undefined; |
function GetQuotedStringRE() { |
- if (IS_UNDEFINED(QUOTED_STRING_RE)) { |
+ if (QUOTED_STRING_RE === undefined) { |
QUOTED_STRING_RE = new GlobalRegExp("'[^']+'", 'g'); |
} |
return QUOTED_STRING_RE; |
@@ -89,10 +80,10 @@ |
/** |
* Matches valid service name. |
*/ |
-var SERVICE_RE = UNDEFINED; |
+var SERVICE_RE = undefined; |
function GetServiceRE() { |
- if (IS_UNDEFINED(SERVICE_RE)) { |
+ if (SERVICE_RE === undefined) { |
SERVICE_RE = |
new GlobalRegExp('^(collator|numberformat|dateformat|breakiterator)$'); |
} |
@@ -103,10 +94,10 @@ |
* Validates a language tag against bcp47 spec. |
* Actual value is assigned on first run. |
*/ |
-var LANGUAGE_TAG_RE = UNDEFINED; |
+var LANGUAGE_TAG_RE = undefined; |
function GetLanguageTagRE() { |
- if (IS_UNDEFINED(LANGUAGE_TAG_RE)) { |
+ if (LANGUAGE_TAG_RE === undefined) { |
BuildLanguageTagREs(); |
} |
return LANGUAGE_TAG_RE; |
@@ -115,10 +106,10 @@ |
/** |
* Helps find duplicate variants in the language tag. |
*/ |
-var LANGUAGE_VARIANT_RE = UNDEFINED; |
+var LANGUAGE_VARIANT_RE = undefined; |
function GetLanguageVariantRE() { |
- if (IS_UNDEFINED(LANGUAGE_VARIANT_RE)) { |
+ if (LANGUAGE_VARIANT_RE === undefined) { |
BuildLanguageTagREs(); |
} |
return LANGUAGE_VARIANT_RE; |
@@ -127,10 +118,10 @@ |
/** |
* Helps find duplicate singletons in the language tag. |
*/ |
-var LANGUAGE_SINGLETON_RE = UNDEFINED; |
+var LANGUAGE_SINGLETON_RE = undefined; |
function GetLanguageSingletonRE() { |
- if (IS_UNDEFINED(LANGUAGE_SINGLETON_RE)) { |
+ if (LANGUAGE_SINGLETON_RE === undefined) { |
BuildLanguageTagREs(); |
} |
return LANGUAGE_SINGLETON_RE; |
@@ -139,10 +130,10 @@ |
/** |
* Matches valid IANA time zone names. |
*/ |
-var TIMEZONE_NAME_CHECK_RE = UNDEFINED; |
+var TIMEZONE_NAME_CHECK_RE = undefined; |
function GetTimezoneNameCheckRE() { |
- if (IS_UNDEFINED(TIMEZONE_NAME_CHECK_RE)) { |
+ if (TIMEZONE_NAME_CHECK_RE === undefined) { |
TIMEZONE_NAME_CHECK_RE = |
new GlobalRegExp('^([A-Za-z]+)/([A-Za-z]+)(?:_([A-Za-z]+))*$'); |
} |
@@ -158,10 +149,10 @@ |
throw MakeTypeError(kMethodCalledOnWrongObject, methodName); |
} |
var internalName = '__bound' + methodName + '__'; |
- if (IS_UNDEFINED(this[internalName])) { |
+ if (this[internalName] === undefined) { |
var that = this; |
var boundMethod; |
- if (IS_UNDEFINED(length) || length === 2) { |
+ if (length === undefined || length === 2) { |
boundMethod = function(x, y) { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
@@ -220,14 +211,14 @@ |
} |
// Provide defaults if matcher was not specified. |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} else { |
options = $toObject(options); |
} |
var matcher = options.localeMatcher; |
- if (!IS_UNDEFINED(matcher)) { |
+ if (matcher !== undefined) { |
matcher = GlobalString(matcher); |
if (matcher !== 'lookup' && matcher !== 'best fit') { |
throw MakeRangeError(kLocaleMatcher, matcher); |
@@ -239,7 +230,7 @@ |
var requestedLocales = initializeLocaleList(locales); |
// Cache these, they don't ever change per service. |
- if (IS_UNDEFINED(AVAILABLE_LOCALES[service])) { |
+ if (AVAILABLE_LOCALES[service] === undefined) { |
AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); |
} |
@@ -265,7 +256,7 @@ |
// Remove -u- extension. |
var locale = requestedLocales[i].replace(GetUnicodeExtensionRE(), ''); |
do { |
- if (!IS_UNDEFINED(availableLocales[locale])) { |
+ if (availableLocales[locale] !== undefined) { |
// Push requested locale not the resolved one. |
matchedLocales.push(requestedLocales[i]); |
break; |
@@ -301,10 +292,10 @@ |
* is out of range for that property it throws RangeError. |
*/ |
function getGetOption(options, caller) { |
- if (IS_UNDEFINED(options)) throw MakeError(kDefaultOptionsMissing, caller); |
+ if (options === undefined) throw MakeError(kDefaultOptionsMissing, caller); |
var getOption = function getOption(property, type, values, defaultValue) { |
- if (!IS_UNDEFINED(options[property])) { |
+ if (options[property] !== undefined) { |
var value = options[property]; |
switch (type) { |
case 'boolean': |
@@ -319,7 +310,7 @@ |
default: |
throw MakeError(kWrongValueType); |
} |
- if (!IS_UNDEFINED(values) && values.indexOf(value) === -1) { |
+ if (values !== undefined && values.indexOf(value) === -1) { |
throw MakeRangeError(kValueOutOfRange, value, caller, property); |
} |
@@ -373,7 +364,7 @@ |
} |
// Cache these, they don't ever change per service. |
- if (IS_UNDEFINED(AVAILABLE_LOCALES[service])) { |
+ if (AVAILABLE_LOCALES[service] === undefined) { |
AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); |
} |
@@ -381,7 +372,7 @@ |
// Remove all extensions. |
var locale = requestedLocales[i].replace(GetAnyExtensionRE(), ''); |
do { |
- if (!IS_UNDEFINED(AVAILABLE_LOCALES[service][locale])) { |
+ if (AVAILABLE_LOCALES[service][locale] !== undefined) { |
// Return the resolved locale and extension. |
var extensionMatch = requestedLocales[i].match(GetUnicodeExtensionRE()); |
var extension = IS_NULL(extensionMatch) ? '' : extensionMatch[0]; |
@@ -397,7 +388,7 @@ |
} |
// Didn't find a match, return default. |
- if (IS_UNDEFINED(DEFAULT_ICU_LOCALE)) { |
+ if (DEFAULT_ICU_LOCALE === undefined) { |
DEFAULT_ICU_LOCALE = %GetDefaultICULocale(); |
} |
@@ -432,16 +423,16 @@ |
// Key is {2}alphanum, value is {3,8}alphanum. |
// Some keys may not have explicit values (booleans). |
var extensionMap = {}; |
- var previousKey = UNDEFINED; |
+ var previousKey = undefined; |
for (var i = 2; i < extensionSplit.length; ++i) { |
var length = extensionSplit[i].length; |
var element = extensionSplit[i]; |
if (length === 2) { |
- extensionMap[element] = UNDEFINED; |
+ extensionMap[element] = undefined; |
previousKey = element; |
- } else if (length >= 3 && length <=8 && !IS_UNDEFINED(previousKey)) { |
+ } else if (length >= 3 && length <=8 && previousKey !== undefined) { |
extensionMap[previousKey] = element; |
- previousKey = UNDEFINED; |
+ previousKey = undefined; |
} else { |
// There is a value that's too long, or that doesn't have a key. |
return {}; |
@@ -474,21 +465,21 @@ |
value = (value === 'true') ? true : false; |
} |
- if (!IS_UNDEFINED(property)) { |
+ if (property !== undefined) { |
defineWEProperty(outOptions, property, value); |
} |
} |
for (var key in keyValues) { |
if (keyValues.hasOwnProperty(key)) { |
- var value = UNDEFINED; |
+ var value = undefined; |
var map = keyValues[key]; |
- if (!IS_UNDEFINED(map.property)) { |
+ if (map.property !== undefined) { |
// This may return true if user specifies numeric: 'false', since |
// Boolean('nonempty') === true. |
value = getOption(map.property, map.type, map.values); |
} |
- if (!IS_UNDEFINED(value)) { |
+ if (value !== undefined) { |
updateProperty(map.property, map.type, value); |
extension += updateExtension(key, value); |
continue; |
@@ -498,7 +489,7 @@ |
// values (not a user error). |
if (extensionMap.hasOwnProperty(key)) { |
value = extensionMap[key]; |
- if (!IS_UNDEFINED(value)) { |
+ if (value !== undefined) { |
updateProperty(map.property, map.type, value); |
extension += updateExtension(key, value); |
} else if (map.type === 'boolean') { |
@@ -599,7 +590,7 @@ |
* Sets configurable descriptor to false. |
*/ |
function addWEPropertyIfDefined(object, property, value) { |
- if (!IS_UNDEFINED(value)) { |
+ if (value !== undefined) { |
defineWEProperty(object, property, value); |
} |
} |
@@ -621,7 +612,7 @@ |
* Sets all descriptors to true. |
*/ |
function addWECPropertyIfDefined(object, property, value) { |
- if (!IS_UNDEFINED(value)) { |
+ if (value !== undefined) { |
defineWECProperty(object, property, value); |
} |
} |
@@ -669,7 +660,7 @@ |
*/ |
function initializeLocaleList(locales) { |
var seen = []; |
- if (IS_UNDEFINED(locales)) { |
+ if (locales === undefined) { |
// Constructor is called without arguments. |
seen = []; |
} else { |
@@ -802,7 +793,7 @@ |
throw MakeTypeError(kReinitializeIntl, "Collator"); |
} |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} |
@@ -815,13 +806,13 @@ |
var sensitivity = getOption('sensitivity', 'string', |
['base', 'accent', 'case', 'variant']); |
- if (IS_UNDEFINED(sensitivity) && internalOptions.usage === 'sort') { |
+ if (sensitivity === undefined && internalOptions.usage === 'sort') { |
sensitivity = 'variant'; |
} |
defineWEProperty(internalOptions, 'sensitivity', sensitivity); |
defineWEProperty(internalOptions, 'ignorePunctuation', getOption( |
- 'ignorePunctuation', 'boolean', UNDEFINED, false)); |
+ 'ignorePunctuation', 'boolean', undefined, false)); |
var locale = resolveLocale('collator', locales, options); |
@@ -1007,12 +998,12 @@ |
*/ |
function getNumberOption(options, property, min, max, fallback) { |
var value = options[property]; |
- if (!IS_UNDEFINED(value)) { |
+ if (value !== undefined) { |
value = GlobalNumber(value); |
if ($isNaN(value) || value < min || value > max) { |
throw MakeRangeError(kPropertyValueOutOfRange, property); |
} |
- return MathFloor(value); |
+ return $floor(value); |
} |
return fallback; |
@@ -1028,7 +1019,7 @@ |
throw MakeTypeError(kReinitializeIntl, "NumberFormat"); |
} |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} |
@@ -1041,11 +1032,11 @@ |
'style', 'string', ['decimal', 'percent', 'currency'], 'decimal')); |
var currency = getOption('currency', 'string'); |
- if (!IS_UNDEFINED(currency) && !isWellFormedCurrencyCode(currency)) { |
+ if (currency !== undefined && !isWellFormedCurrencyCode(currency)) { |
throw MakeRangeError(kInvalidCurrencyCode, currency); |
} |
- if (internalOptions.style === 'currency' && IS_UNDEFINED(currency)) { |
+ if (internalOptions.style === 'currency' && currency === undefined) { |
throw MakeTypeError(kCurrencyCode); |
} |
@@ -1068,7 +1059,7 @@ |
var mnsd = options['minimumSignificantDigits']; |
var mxsd = options['maximumSignificantDigits']; |
- if (!IS_UNDEFINED(mnsd) || !IS_UNDEFINED(mxsd)) { |
+ if (mnsd !== undefined || mxsd !== undefined) { |
mnsd = getNumberOption(options, 'minimumSignificantDigits', 1, 21, 0); |
defineWEProperty(internalOptions, 'minimumSignificantDigits', mnsd); |
@@ -1078,7 +1069,7 @@ |
// Grouping. |
defineWEProperty(internalOptions, 'useGrouping', getOption( |
- 'useGrouping', 'boolean', UNDEFINED, true)); |
+ 'useGrouping', 'boolean', undefined, true)); |
// ICU prefers options to be passed using -u- extension key/values for |
// number format, so we need to build that. |
@@ -1089,7 +1080,7 @@ |
* for a number format. |
*/ |
var NUMBER_FORMAT_KEY_MAP = { |
- 'nu': {'property': UNDEFINED, 'type': 'string'} |
+ 'nu': {'property': undefined, 'type': 'string'} |
}; |
var extension = setOptions(options, extensionMap, NUMBER_FORMAT_KEY_MAP, |
@@ -1109,10 +1100,10 @@ |
useGrouping: {writable: true} |
}); |
if (internalOptions.hasOwnProperty('minimumSignificantDigits')) { |
- defineWEProperty(resolved, 'minimumSignificantDigits', UNDEFINED); |
+ defineWEProperty(resolved, 'minimumSignificantDigits', undefined); |
} |
if (internalOptions.hasOwnProperty('maximumSignificantDigits')) { |
- defineWEProperty(resolved, 'maximumSignificantDigits', UNDEFINED); |
+ defineWEProperty(resolved, 'maximumSignificantDigits', undefined); |
} |
var formatter = %CreateNumberFormat(requestedLocale, |
internalOptions, |
@@ -1281,7 +1272,7 @@ |
var hr12 = getOption('hour12', 'boolean'); |
option = getOption('hour', 'string', ['2-digit', 'numeric']); |
- if (IS_UNDEFINED(hr12)) { |
+ if (hr12 === undefined) { |
ldmlString += appendToLDMLString(option, {'2-digit': 'jj', 'numeric': 'j'}); |
} else if (hr12 === true) { |
ldmlString += appendToLDMLString(option, {'2-digit': 'hh', 'numeric': 'h'}); |
@@ -1306,7 +1297,7 @@ |
* Returns either LDML equivalent of the current option or empty string. |
*/ |
function appendToLDMLString(option, pairs) { |
- if (!IS_UNDEFINED(option)) { |
+ if (option !== undefined) { |
return pairs[option]; |
} else { |
return ''; |
@@ -1380,7 +1371,7 @@ |
function appendToDateTimeObject(options, option, match, pairs) { |
if (IS_NULL(match)) { |
if (!options.hasOwnProperty(option)) { |
- defineWEProperty(options, option, UNDEFINED); |
+ defineWEProperty(options, option, undefined); |
} |
return options; |
} |
@@ -1396,7 +1387,7 @@ |
* Returns options with at least default values in it. |
*/ |
function toDateTimeOptions(options, required, defaults) { |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} else { |
options = TO_OBJECT_INLINE(options); |
@@ -1404,14 +1395,14 @@ |
var needsDefault = true; |
if ((required === 'date' || required === 'any') && |
- (!IS_UNDEFINED(options.weekday) || !IS_UNDEFINED(options.year) || |
- !IS_UNDEFINED(options.month) || !IS_UNDEFINED(options.day))) { |
+ (options.weekday !== undefined || options.year !== undefined || |
+ options.month !== undefined || options.day !== undefined)) { |
needsDefault = false; |
} |
if ((required === 'time' || required === 'any') && |
- (!IS_UNDEFINED(options.hour) || !IS_UNDEFINED(options.minute) || |
- !IS_UNDEFINED(options.second))) { |
+ (options.hour !== undefined || options.minute !== undefined || |
+ options.second !== undefined)) { |
needsDefault = false; |
} |
@@ -1459,7 +1450,7 @@ |
throw MakeTypeError(kReinitializeIntl, "DateTimeFormat"); |
} |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} |
@@ -1492,8 +1483,8 @@ |
* for a date/time format. |
*/ |
var DATETIME_FORMAT_KEY_MAP = { |
- 'ca': {'property': UNDEFINED, 'type': 'string'}, |
- 'nu': {'property': UNDEFINED, 'type': 'string'} |
+ 'ca': {'property': undefined, 'type': 'string'}, |
+ 'nu': {'property': undefined, 'type': 'string'} |
}; |
var extension = setOptions(options, extensionMap, DATETIME_FORMAT_KEY_MAP, |
@@ -1523,7 +1514,7 @@ |
var formatter = %CreateDateTimeFormat( |
requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved); |
- if (!IS_UNDEFINED(tz) && tz !== resolved.timeZone) { |
+ if (tz !== undefined && tz !== resolved.timeZone) { |
throw MakeRangeError(kUnsupportedTimeZone, tz); |
} |
@@ -1589,7 +1580,7 @@ |
var format = this; |
var fromPattern = fromLDMLString(format.resolved.pattern); |
var userCalendar = ICU_CALENDAR_MAP[format.resolved.calendar]; |
- if (IS_UNDEFINED(userCalendar)) { |
+ if (userCalendar === undefined) { |
// Use ICU name if we don't have a match. It shouldn't happen, but |
// it would be too strict to throw for this. |
userCalendar = format.resolved.calendar; |
@@ -1653,7 +1644,7 @@ |
*/ |
function formatDate(formatter, dateValue) { |
var dateMs; |
- if (IS_UNDEFINED(dateValue)) { |
+ if (dateValue === undefined) { |
dateMs = GlobalDate.now(); |
} else { |
dateMs = $toNumber(dateValue); |
@@ -1689,7 +1680,7 @@ |
*/ |
function canonicalizeTimeZoneID(tzID) { |
// Skip undefined zones. |
- if (IS_UNDEFINED(tzID)) { |
+ if (tzID === undefined) { |
return tzID; |
} |
@@ -1707,7 +1698,7 @@ |
var result = toTitleCaseWord(match[1]) + '/' + toTitleCaseWord(match[2]); |
var i = 3; |
- while (!IS_UNDEFINED(match[i]) && i < match.length) { |
+ while (match[i] !== undefined && i < match.length) { |
result = result + '_' + toTitleCaseWord(match[i]); |
i++; |
} |
@@ -1724,7 +1715,7 @@ |
throw MakeTypeError(kReinitializeIntl, "v8BreakIterator"); |
} |
- if (IS_UNDEFINED(options)) { |
+ if (options === undefined) { |
options = {}; |
} |
@@ -1887,11 +1878,11 @@ |
// Default (created with undefined locales and options parameters) collator, |
// number and date format instances. They'll be created as needed. |
var defaultObjects = { |
- 'collator': UNDEFINED, |
- 'numberformat': UNDEFINED, |
- 'dateformatall': UNDEFINED, |
- 'dateformatdate': UNDEFINED, |
- 'dateformattime': UNDEFINED, |
+ 'collator': undefined, |
+ 'numberformat': undefined, |
+ 'dateformatall': undefined, |
+ 'dateformatdate': undefined, |
+ 'dateformattime': undefined, |
}; |
@@ -1900,9 +1891,9 @@ |
* We cache only default instances (where no locales or options are provided). |
*/ |
function cachedOrNewService(service, locales, options, defaults) { |
- var useOptions = (IS_UNDEFINED(defaults)) ? options : defaults; |
- if (IS_UNDEFINED(locales) && IS_UNDEFINED(options)) { |
- if (IS_UNDEFINED(defaultObjects[service])) { |
+ var useOptions = (defaults === undefined) ? options : defaults; |
+ if (locales === undefined && options === undefined) { |
+ if (defaultObjects[service] === undefined) { |
defaultObjects[service] = new savedObjects[service](locales, useOptions); |
} |
return defaultObjects[service]; |