Index: src/i18n.js |
diff --git a/src/i18n.js b/src/i18n.js |
index 94fe7d653e9dd78352b2ccf7f120c52c484c093c..ae01cc464343200775386ccd9ab91791ab98d997 100644 |
--- a/src/i18n.js |
+++ b/src/i18n.js |
@@ -22,10 +22,17 @@ var GlobalDate = global.Date; |
var GlobalNumber = global.Number; |
var GlobalRegExp = global.RegExp; |
var GlobalString = global.String; |
+var ObjectDefineProperties = utils.ObjectDefineProperties; |
+var ObjectDefineProperty = utils.ObjectDefineProperty; |
+var SetFunctionName = utils.SetFunctionName; |
+var IsFinite; |
+var IsNaN; |
var MathFloor; |
utils.Import(function(from) { |
+ IsFinite = from.IsFinite; |
+ IsNaN = from.IsNaN; |
MathFloor = from.MathFloor; |
}); |
@@ -153,6 +160,7 @@ function GetTimezoneNameCheckRE() { |
* Adds bound method to the prototype of the given object. |
*/ |
function addBoundMethod(obj, methodName, implementation, length) { |
+ %CheckIsBootstrapping(); |
function getter() { |
if (!%IsInitializedIntlObject(this)) { |
throw MakeTypeError(kMethodCalledOnWrongObject, methodName); |
@@ -190,7 +198,7 @@ function addBoundMethod(obj, methodName, implementation, length) { |
} |
} |
} |
- $setFunctionName(boundMethod, internalName); |
+ SetFunctionName(boundMethod, internalName); |
%FunctionRemovePrototype(boundMethod); |
%SetNativeFlag(boundMethod); |
this[internalName] = boundMethod; |
@@ -198,11 +206,11 @@ function addBoundMethod(obj, methodName, implementation, length) { |
return this[internalName]; |
} |
- $setFunctionName(getter, methodName); |
+ SetFunctionName(getter, methodName); |
%FunctionRemovePrototype(getter); |
%SetNativeFlag(getter); |
- $objectDefineProperty(obj.prototype, methodName, { |
+ ObjectDefineProperty(obj.prototype, methodName, { |
get: getter, |
enumerable: false, |
configurable: true |
@@ -521,14 +529,14 @@ function setOptions(inOptions, extensionMap, keyValues, getOption, outOptions) { |
*/ |
function freezeArray(array) { |
array.forEach(function(element, index) { |
- $objectDefineProperty(array, index, {value: element, |
- configurable: false, |
- writable: false, |
- enumerable: true}); |
+ ObjectDefineProperty(array, index, {value: element, |
+ configurable: false, |
+ writable: false, |
+ enumerable: true}); |
}); |
- $objectDefineProperty(array, 'length', {value: array.length, |
- writable: false}); |
+ ObjectDefineProperty(array, 'length', {value: array.length, |
+ writable: false}); |
return array; |
} |
@@ -589,8 +597,8 @@ function getAvailableLocalesOf(service) { |
* Configurable is false by default. |
*/ |
function defineWEProperty(object, property, value) { |
- $objectDefineProperty(object, property, |
- {value: value, writable: true, enumerable: true}); |
+ ObjectDefineProperty(object, property, |
+ {value: value, writable: true, enumerable: true}); |
} |
@@ -609,10 +617,10 @@ function addWEPropertyIfDefined(object, property, value) { |
* Defines a property and sets writable, enumerable and configurable to true. |
*/ |
function defineWECProperty(object, property, value) { |
- $objectDefineProperty(object, property, {value: value, |
- writable: true, |
- enumerable: true, |
- configurable: true}); |
+ ObjectDefineProperty(object, property, {value: value, |
+ writable: true, |
+ enumerable: true, |
+ configurable: true}); |
} |
@@ -873,7 +881,7 @@ function initializeCollator(collator, locales, options) { |
// problems. If malicious user decides to redefine Object.prototype.locale |
// we can't just use plain x.locale = 'us' or in C++ Set("locale", "us"). |
// ObjectDefineProperties will either succeed defining or throw an error. |
- var resolved = $objectDefineProperties({}, { |
+ var resolved = ObjectDefineProperties({}, { |
caseFirst: {writable: true}, |
collation: {value: internalOptions.collation, writable: true}, |
ignorePunctuation: {writable: true}, |
@@ -891,7 +899,7 @@ function initializeCollator(collator, locales, options) { |
// Writable, configurable and enumerable are set to false by default. |
%MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator); |
- $objectDefineProperty(collator, 'resolved', {value: resolved}); |
+ ObjectDefineProperty(collator, 'resolved', {value: resolved}); |
return collator; |
} |
@@ -946,7 +954,7 @@ function initializeCollator(collator, locales, options) { |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); |
+SetFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); |
%FunctionRemovePrototype(Intl.Collator.prototype.resolvedOptions); |
%SetNativeFlag(Intl.Collator.prototype.resolvedOptions); |
@@ -966,7 +974,7 @@ $setFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); |
+SetFunctionName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); |
%FunctionRemovePrototype(Intl.Collator.supportedLocalesOf); |
%SetNativeFlag(Intl.Collator.supportedLocalesOf); |
@@ -1009,7 +1017,7 @@ function getNumberOption(options, property, min, max, fallback) { |
var value = options[property]; |
if (!IS_UNDEFINED(value)) { |
value = GlobalNumber(value); |
- if ($isNaN(value) || value < min || value > max) { |
+ if (IsNaN(value) || value < min || value > max) { |
throw MakeRangeError(kPropertyValueOutOfRange, property); |
} |
return MathFloor(value); |
@@ -1096,7 +1104,7 @@ function initializeNumberFormat(numberFormat, locales, options) { |
getOption, internalOptions); |
var requestedLocale = locale.locale + extension; |
- var resolved = $objectDefineProperties({}, { |
+ var resolved = ObjectDefineProperties({}, { |
currency: {writable: true}, |
currencyDisplay: {writable: true}, |
locale: {writable: true}, |
@@ -1121,12 +1129,12 @@ function initializeNumberFormat(numberFormat, locales, options) { |
// We can't get information about number or currency style from ICU, so we |
// assume user request was fulfilled. |
if (internalOptions.style === 'currency') { |
- $objectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, |
- writable: true}); |
+ ObjectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, |
+ writable: true}); |
} |
%MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter); |
- $objectDefineProperty(numberFormat, 'resolved', {value: resolved}); |
+ ObjectDefineProperty(numberFormat, 'resolved', {value: resolved}); |
return numberFormat; |
} |
@@ -1199,8 +1207,7 @@ function initializeNumberFormat(numberFormat, locales, options) { |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.NumberFormat.prototype.resolvedOptions, |
- 'resolvedOptions'); |
+SetFunctionName(Intl.NumberFormat.prototype.resolvedOptions, 'resolvedOptions'); |
%FunctionRemovePrototype(Intl.NumberFormat.prototype.resolvedOptions); |
%SetNativeFlag(Intl.NumberFormat.prototype.resolvedOptions); |
@@ -1220,7 +1227,7 @@ $setFunctionName(Intl.NumberFormat.prototype.resolvedOptions, |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); |
+SetFunctionName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); |
%FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf); |
%SetNativeFlag(Intl.NumberFormat.supportedLocalesOf); |
@@ -1416,33 +1423,33 @@ function toDateTimeOptions(options, required, defaults) { |
} |
if (needsDefault && (defaults === 'date' || defaults === 'all')) { |
- $objectDefineProperty(options, 'year', {value: 'numeric', |
- writable: true, |
- enumerable: true, |
- configurable: true}); |
- $objectDefineProperty(options, 'month', {value: 'numeric', |
- writable: true, |
- enumerable: true, |
- configurable: true}); |
- $objectDefineProperty(options, 'day', {value: 'numeric', |
+ ObjectDefineProperty(options, 'year', {value: 'numeric', |
writable: true, |
enumerable: true, |
configurable: true}); |
- } |
- |
- if (needsDefault && (defaults === 'time' || defaults === 'all')) { |
- $objectDefineProperty(options, 'hour', {value: 'numeric', |
+ ObjectDefineProperty(options, 'month', {value: 'numeric', |
writable: true, |
enumerable: true, |
configurable: true}); |
- $objectDefineProperty(options, 'minute', {value: 'numeric', |
- writable: true, |
- enumerable: true, |
- configurable: true}); |
- $objectDefineProperty(options, 'second', {value: 'numeric', |
- writable: true, |
- enumerable: true, |
- configurable: true}); |
+ ObjectDefineProperty(options, 'day', {value: 'numeric', |
+ writable: true, |
+ enumerable: true, |
+ configurable: true}); |
+ } |
+ |
+ if (needsDefault && (defaults === 'time' || defaults === 'all')) { |
+ ObjectDefineProperty(options, 'hour', {value: 'numeric', |
+ writable: true, |
+ enumerable: true, |
+ configurable: true}); |
+ ObjectDefineProperty(options, 'minute', {value: 'numeric', |
+ writable: true, |
+ enumerable: true, |
+ configurable: true}); |
+ ObjectDefineProperty(options, 'second', {value: 'numeric', |
+ writable: true, |
+ enumerable: true, |
+ configurable: true}); |
} |
return options; |
@@ -1500,7 +1507,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
getOption, internalOptions); |
var requestedLocale = locale.locale + extension; |
- var resolved = $objectDefineProperties({}, { |
+ var resolved = ObjectDefineProperties({}, { |
calendar: {writable: true}, |
day: {writable: true}, |
era: {writable: true}, |
@@ -1528,7 +1535,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
} |
%MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); |
- $objectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
+ ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
return dateFormat; |
} |
@@ -1620,7 +1627,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, |
+SetFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, |
'resolvedOptions'); |
%FunctionRemovePrototype(Intl.DateTimeFormat.prototype.resolvedOptions); |
%SetNativeFlag(Intl.DateTimeFormat.prototype.resolvedOptions); |
@@ -1641,7 +1648,7 @@ $setFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); |
+SetFunctionName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); |
%FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf); |
%SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf); |
@@ -1659,7 +1666,7 @@ function formatDate(formatter, dateValue) { |
dateMs = $toNumber(dateValue); |
} |
- if (!$isFinite(dateMs)) throw MakeRangeError(kDateRange); |
+ if (!IsFinite(dateMs)) throw MakeRangeError(kDateRange); |
return %InternalDateFormat(%GetImplFromInitializedIntlObject(formatter), |
new GlobalDate(dateMs)); |
@@ -1736,7 +1743,7 @@ function initializeBreakIterator(iterator, locales, options) { |
'type', 'string', ['character', 'word', 'sentence', 'line'], 'word')); |
var locale = resolveLocale('breakiterator', locales, options); |
- var resolved = $objectDefineProperties({}, { |
+ var resolved = ObjectDefineProperties({}, { |
requestedLocale: {value: locale.locale, writable: true}, |
type: {value: internalOptions.type, writable: true}, |
locale: {writable: true} |
@@ -1748,7 +1755,7 @@ function initializeBreakIterator(iterator, locales, options) { |
%MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', |
internalIterator); |
- $objectDefineProperty(iterator, 'resolved', {value: resolved}); |
+ ObjectDefineProperty(iterator, 'resolved', {value: resolved}); |
return iterator; |
} |
@@ -1799,7 +1806,7 @@ function initializeBreakIterator(iterator, locales, options) { |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, |
+SetFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, |
'resolvedOptions'); |
%FunctionRemovePrototype(Intl.v8BreakIterator.prototype.resolvedOptions); |
%SetNativeFlag(Intl.v8BreakIterator.prototype.resolvedOptions); |
@@ -1821,7 +1828,7 @@ $setFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, |
}, |
DONT_ENUM |
); |
-$setFunctionName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); |
+SetFunctionName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); |
%FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); |
%SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); |
@@ -1911,11 +1918,22 @@ function cachedOrNewService(service, locales, options, defaults) { |
} |
+function OverrideFunction(object, name, f) { |
+ %CheckIsBootstrapping(); |
+ ObjectDefineProperty(object, name, { value: f, |
+ writeable: true, |
+ configurable: true, |
+ enumerable: false }); |
+ SetFunctionName(f, name); |
+ %FunctionRemovePrototype(f); |
+ %SetNativeFlag(f); |
+} |
+ |
/** |
* Compares this and that, and returns less than 0, 0 or greater than 0 value. |
* Overrides the built-in method. |
*/ |
-$overrideFunction(GlobalString.prototype, 'localeCompare', function(that) { |
+OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |
@@ -1939,7 +1957,7 @@ $overrideFunction(GlobalString.prototype, 'localeCompare', function(that) { |
* If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw |
* a RangeError Exception. |
*/ |
-$overrideFunction(GlobalString.prototype, 'normalize', function(that) { |
+OverrideFunction(GlobalString.prototype, 'normalize', function(that) { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |
@@ -1964,7 +1982,7 @@ $overrideFunction(GlobalString.prototype, 'normalize', function(that) { |
* Formats a Number object (this) using locale and options values. |
* If locale or options are omitted, defaults are used. |
*/ |
-$overrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { |
+OverrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |
@@ -1989,9 +2007,7 @@ function toLocaleDateTime(date, locales, options, required, defaults, service) { |
throw MakeTypeError(kMethodInvokedOnWrongType, "Date"); |
} |
- if ($isNaN(date)) { |
- return 'Invalid Date'; |
- } |
+ if (IsNaN(date)) return 'Invalid Date'; |
var internalOptions = toDateTimeOptions(options, required, defaults); |
@@ -2007,7 +2023,7 @@ function toLocaleDateTime(date, locales, options, required, defaults, service) { |
* If locale or options are omitted, defaults are used - both date and time are |
* present in the output. |
*/ |
-$overrideFunction(GlobalDate.prototype, 'toLocaleString', function() { |
+OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |
@@ -2025,7 +2041,7 @@ $overrideFunction(GlobalDate.prototype, 'toLocaleString', function() { |
* If locale or options are omitted, defaults are used - only date is present |
* in the output. |
*/ |
-$overrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { |
+OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |
@@ -2043,7 +2059,7 @@ $overrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { |
* If locale or options are omitted, defaults are used - only time is present |
* in the output. |
*/ |
-$overrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { |
+OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { |
if (%_IsConstructCall()) { |
throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); |
} |