Index: src/js/i18n.js |
diff --git a/src/js/i18n.js b/src/js/i18n.js |
index c32e8f18e6938a4f396350c3bef3181cfe14ee8a..7e00fcdac45f00f07ff008764aaa9e46691a81b4 100644 |
--- a/src/js/i18n.js |
+++ b/src/js/i18n.js |
@@ -33,7 +33,9 @@ var MakeTypeError; |
var MathFloor; |
var ObjectDefineProperties = utils.ImportNow("ObjectDefineProperties"); |
var ObjectDefineProperty = utils.ImportNow("ObjectDefineProperty"); |
+var patternSymbol = utils.ImportNow("intl_pattern_symbol"); |
var RegExpTest; |
+var resolvedSymbol = utils.ImportNow("intl_resolved_symbol"); |
var StringIndexOf; |
var StringLastIndexOf; |
var StringMatch; |
@@ -878,6 +880,16 @@ function BuildLanguageTagREs() { |
LANGUAGE_TAG_RE = new GlobalRegExp(languageTag, 'i'); |
} |
+var resolvedAccessor = { |
+ get() { |
+ %IncrementUseCounter(kIntlResolved); |
+ return this[resolvedSymbol]; |
+ }, |
+ set(value) { |
+ this[resolvedSymbol] = value; |
+ } |
+}; |
+ |
/** |
* Initializes the given object so it's a valid Collator instance. |
* Useful for subclassing. |
@@ -976,7 +988,8 @@ function initializeCollator(collator, locales, options) { |
// Writable, configurable and enumerable are set to false by default. |
%MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator); |
- ObjectDefineProperty(collator, 'resolved', {value: resolved}); |
+ collator[resolvedSymbol] = resolved; |
+ ObjectDefineProperty(collator, 'resolved', resolvedAccessor); |
return collator; |
} |
@@ -1016,17 +1029,17 @@ function initializeCollator(collator, locales, options) { |
} |
var coll = this; |
- var locale = getOptimalLanguageTag(coll.resolved.requestedLocale, |
- coll.resolved.locale); |
+ var locale = getOptimalLanguageTag(coll[resolvedSymbol].requestedLocale, |
+ coll[resolvedSymbol].locale); |
return { |
locale: locale, |
- usage: coll.resolved.usage, |
- sensitivity: coll.resolved.sensitivity, |
- ignorePunctuation: coll.resolved.ignorePunctuation, |
- numeric: coll.resolved.numeric, |
- caseFirst: coll.resolved.caseFirst, |
- collation: coll.resolved.collation |
+ usage: coll[resolvedSymbol].usage, |
+ sensitivity: coll[resolvedSymbol].sensitivity, |
+ ignorePunctuation: coll[resolvedSymbol].ignorePunctuation, |
+ numeric: coll[resolvedSymbol].numeric, |
+ caseFirst: coll[resolvedSymbol].caseFirst, |
+ collation: coll[resolvedSymbol].collation |
}; |
}, |
DONT_ENUM |
@@ -1103,6 +1116,15 @@ function getNumberOption(options, property, min, max, fallback) { |
return fallback; |
} |
+var patternAccessor = { |
+ get() { |
+ %IncrementUseCounter(kIntlPattern); |
+ return this[patternSymbol]; |
+ }, |
+ set(value) { |
+ this[patternSymbol] = value; |
+ } |
+}; |
/** |
* Initializes the given object so it's a valid NumberFormat instance. |
@@ -1198,6 +1220,7 @@ function initializeNumberFormat(numberFormat, locales, options) { |
minimumFractionDigits: {writable: true}, |
minimumIntegerDigits: {writable: true}, |
numberingSystem: {writable: true}, |
+ pattern: patternAccessor, |
requestedLocale: {value: requestedLocale, writable: true}, |
style: {value: internalOptions.style, writable: true}, |
useGrouping: {writable: true} |
@@ -1218,7 +1241,8 @@ function initializeNumberFormat(numberFormat, locales, options) { |
} |
%MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter); |
- ObjectDefineProperty(numberFormat, 'resolved', {value: resolved}); |
+ numberFormat[resolvedSymbol] = resolved; |
+ ObjectDefineProperty(numberFormat, 'resolved', resolvedAccessor); |
return numberFormat; |
} |
@@ -1258,33 +1282,33 @@ function initializeNumberFormat(numberFormat, locales, options) { |
} |
var format = this; |
- var locale = getOptimalLanguageTag(format.resolved.requestedLocale, |
- format.resolved.locale); |
+ var locale = getOptimalLanguageTag(format[resolvedSymbol].requestedLocale, |
+ format[resolvedSymbol].locale); |
var result = { |
locale: locale, |
- numberingSystem: format.resolved.numberingSystem, |
- style: format.resolved.style, |
- useGrouping: format.resolved.useGrouping, |
- minimumIntegerDigits: format.resolved.minimumIntegerDigits, |
- minimumFractionDigits: format.resolved.minimumFractionDigits, |
- maximumFractionDigits: format.resolved.maximumFractionDigits, |
+ numberingSystem: format[resolvedSymbol].numberingSystem, |
+ style: format[resolvedSymbol].style, |
+ useGrouping: format[resolvedSymbol].useGrouping, |
+ minimumIntegerDigits: format[resolvedSymbol].minimumIntegerDigits, |
+ minimumFractionDigits: format[resolvedSymbol].minimumFractionDigits, |
+ maximumFractionDigits: format[resolvedSymbol].maximumFractionDigits, |
}; |
if (result.style === 'currency') { |
- defineWECProperty(result, 'currency', format.resolved.currency); |
+ defineWECProperty(result, 'currency', format[resolvedSymbol].currency); |
defineWECProperty(result, 'currencyDisplay', |
- format.resolved.currencyDisplay); |
+ format[resolvedSymbol].currencyDisplay); |
} |
- if (%HasOwnProperty(format.resolved, 'minimumSignificantDigits')) { |
+ if (%HasOwnProperty(format[resolvedSymbol], 'minimumSignificantDigits')) { |
defineWECProperty(result, 'minimumSignificantDigits', |
- format.resolved.minimumSignificantDigits); |
+ format[resolvedSymbol].minimumSignificantDigits); |
} |
- if (%HasOwnProperty(format.resolved, 'maximumSignificantDigits')) { |
+ if (%HasOwnProperty(format[resolvedSymbol], 'maximumSignificantDigits')) { |
defineWECProperty(result, 'maximumSignificantDigits', |
- format.resolved.maximumSignificantDigits); |
+ format[resolvedSymbol].maximumSignificantDigits); |
} |
return result; |
@@ -1602,7 +1626,8 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
minute: {writable: true}, |
month: {writable: true}, |
numberingSystem: {writable: true}, |
- pattern: {writable: true}, |
+ [patternSymbol]: {writable: true}, |
+ pattern: patternAccessor, |
requestedLocale: {value: requestedLocale, writable: true}, |
second: {writable: true}, |
timeZone: {writable: true}, |
@@ -1620,7 +1645,8 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
} |
%MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); |
- ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
+ dateFormat[resolvedSymbol] = resolved; |
+ ObjectDefineProperty(dateFormat, 'resolved', resolvedAccessor); |
return dateFormat; |
} |
@@ -1679,22 +1705,22 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
}; |
var format = this; |
- var fromPattern = fromLDMLString(format.resolved.pattern); |
- var userCalendar = ICU_CALENDAR_MAP[format.resolved.calendar]; |
+ var fromPattern = fromLDMLString(format[resolvedSymbol][patternSymbol]); |
+ var userCalendar = ICU_CALENDAR_MAP[format[resolvedSymbol].calendar]; |
if (IS_UNDEFINED(userCalendar)) { |
// 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; |
+ userCalendar = format[resolvedSymbol].calendar; |
} |
- var locale = getOptimalLanguageTag(format.resolved.requestedLocale, |
- format.resolved.locale); |
+ var locale = getOptimalLanguageTag(format[resolvedSymbol].requestedLocale, |
+ format[resolvedSymbol].locale); |
var result = { |
locale: locale, |
- numberingSystem: format.resolved.numberingSystem, |
+ numberingSystem: format[resolvedSymbol].numberingSystem, |
calendar: userCalendar, |
- timeZone: format.resolved.timeZone |
+ timeZone: format[resolvedSymbol].timeZone |
}; |
addWECPropertyIfDefined(result, 'timeZoneName', fromPattern.timeZoneName); |
@@ -1846,7 +1872,8 @@ function initializeBreakIterator(iterator, locales, options) { |
%MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', |
internalIterator); |
- ObjectDefineProperty(iterator, 'resolved', {value: resolved}); |
+ iterator[resolvedSymbol] = resolved; |
+ ObjectDefineProperty(iterator, 'resolved', resolvedAccessor); |
return iterator; |
} |
@@ -1887,12 +1914,13 @@ function initializeBreakIterator(iterator, locales, options) { |
} |
var segmenter = this; |
- var locale = getOptimalLanguageTag(segmenter.resolved.requestedLocale, |
- segmenter.resolved.locale); |
+ var locale = |
+ getOptimalLanguageTag(segmenter[resolvedSymbol].requestedLocale, |
+ segmenter[resolvedSymbol].locale); |
return { |
locale: locale, |
- type: segmenter.resolved.type |
+ type: segmenter[resolvedSymbol].type |
}; |
}, |
DONT_ENUM |