Chromium Code Reviews| Index: src/i18n.js |
| diff --git a/src/i18n.js b/src/i18n.js |
| index 94fe7d653e9dd78352b2ccf7f120c52c484c093c..c95827a41818ebd03cded9f2b94126292a084c56 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,8 @@ function initializeCollator(collator, locales, options) { |
| }, |
| DONT_ENUM |
| ); |
| -$setFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); |
| +SetFunctionName(Intl.Collator.prototype.resolvedOptions, |
|
Jakob Kummerow
2015/05/21 13:45:24
nit: should still fit on one line
|
| + 'resolvedOptions'); |
| %FunctionRemovePrototype(Intl.Collator.prototype.resolvedOptions); |
| %SetNativeFlag(Intl.Collator.prototype.resolvedOptions); |
| @@ -966,7 +975,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 +1018,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 +1105,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 +1130,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 +1208,8 @@ 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 +1229,8 @@ $setFunctionName(Intl.NumberFormat.prototype.resolvedOptions, |
| }, |
| DONT_ENUM |
| ); |
| -$setFunctionName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); |
| +SetFunctionName(Intl.NumberFormat.supportedLocalesOf, |
|
Jakob Kummerow
2015/05/21 13:45:24
nit: should still fit on one line
|
| + 'supportedLocalesOf'); |
| %FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf); |
| %SetNativeFlag(Intl.NumberFormat.supportedLocalesOf); |
| @@ -1416,33 +1426,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 +1510,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 +1538,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { |
| } |
| %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); |
| - $objectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
| + ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); |
| return dateFormat; |
| } |
| @@ -1620,7 +1630,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 +1651,8 @@ $setFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, |
| }, |
| DONT_ENUM |
| ); |
| -$setFunctionName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); |
| +SetFunctionName(Intl.DateTimeFormat.supportedLocalesOf, |
|
Jakob Kummerow
2015/05/21 13:45:24
nit: should still fit on one line
|
| + 'supportedLocalesOf'); |
| %FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf); |
| %SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf); |
| @@ -1659,7 +1670,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 +1747,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 +1759,7 @@ function initializeBreakIterator(iterator, locales, options) { |
| %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', |
| internalIterator); |
| - $objectDefineProperty(iterator, 'resolved', {value: resolved}); |
| + ObjectDefineProperty(iterator, 'resolved', {value: resolved}); |
| return iterator; |
| } |
| @@ -1799,7 +1810,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 +1832,8 @@ $setFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, |
| }, |
| DONT_ENUM |
| ); |
| -$setFunctionName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); |
| +SetFunctionName(Intl.v8BreakIterator.supportedLocalesOf, |
|
Jakob Kummerow
2015/05/21 13:45:24
nit: should still fit on one line
|
| + 'supportedLocalesOf'); |
| %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); |
| %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); |
| @@ -1911,11 +1923,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 +1962,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 +1987,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 +2012,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 +2028,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 +2046,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 +2064,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); |
| } |