| Index: src/js/i18n.js
|
| diff --git a/src/js/i18n.js b/src/js/i18n.js
|
| index 13e78dcd0859823a0338c7fda2ca37a84916d3dd..c146029aff17809dad25a5b499190933a6cad467 100644
|
| --- a/src/js/i18n.js
|
| +++ b/src/js/i18n.js
|
| @@ -20,6 +20,8 @@
|
| var ArrayIndexOf;
|
| var ArrayJoin;
|
| var ArrayPush;
|
| +var InstallFunctions = utils.InstallFunctions;
|
| +var InstallGetter = utils.InstallGetter;
|
| var IsFinite;
|
| var IsNaN;
|
| var GlobalBoolean = global.Boolean;
|
| @@ -36,6 +38,7 @@ var ObjectDefineProperty = utils.ImportNow("ObjectDefineProperty");
|
| var patternSymbol = utils.ImportNow("intl_pattern_symbol");
|
| var RegExpTest;
|
| var resolvedSymbol = utils.ImportNow("intl_resolved_symbol");
|
| +var SetFunctionName = utils.SetFunctionName;
|
| var StringIndexOf;
|
| var StringLastIndexOf;
|
| var StringMatch;
|
| @@ -64,6 +67,74 @@ utils.Import(function(from) {
|
| StringSubstring = from.StringSubstring;
|
| });
|
|
|
| +// Utilities for definitions
|
| +
|
| +function OverrideFunction(object, name, f) {
|
| + %CheckIsBootstrapping();
|
| + ObjectDefineProperty(object, name, { value: f,
|
| + writeable: true,
|
| + configurable: true,
|
| + enumerable: false });
|
| + %FunctionSetName(f, name);
|
| + %FunctionRemovePrototype(f);
|
| + %SetNativeFlag(f);
|
| +}
|
| +
|
| +function InstallFunction(object, name, func) {
|
| + InstallFunctions(object, DONT_ENUM, [name, func]);
|
| +}
|
| +
|
| +
|
| +function InstallConstructor(object, name, func) {
|
| + %CheckIsBootstrapping();
|
| + SetFunctionName(func, name);
|
| + %AddNamedProperty(object, name, func, DONT_ENUM);
|
| + %SetNativeFlag(func);
|
| + %ToFastProperties(object);
|
| +}
|
| +
|
| +/**
|
| + * Adds bound method to the prototype of the given object.
|
| + */
|
| +function AddBoundMethod(obj, methodName, implementation, length) {
|
| + %CheckIsBootstrapping();
|
| + var internalName = %CreatePrivateSymbol(methodName);
|
| + var getter = function() {
|
| + if (!%IsInitializedIntlObject(this)) {
|
| + throw MakeTypeError(kMethodCalledOnWrongObject, methodName);
|
| + }
|
| + if (IS_UNDEFINED(this[internalName])) {
|
| + var boundMethod;
|
| + if (IS_UNDEFINED(length) || length === 2) {
|
| + boundMethod = (x, y) => implementation(this, x, y);
|
| + } else if (length === 1) {
|
| + boundMethod = x => implementation(this, x);
|
| + } else {
|
| + boundMethod = (...args) => {
|
| + // DateTimeFormat.format needs to be 0 arg method, but can stil
|
| + // receive optional dateValue param. If one was provided, pass it
|
| + // along.
|
| + if (args.length > 0) {
|
| + return implementation(this, args[0]);
|
| + } else {
|
| + return implementation(this);
|
| + }
|
| + }
|
| + }
|
| + // TODO(littledan): Once function name reform is shipped, remove the
|
| + // following line and wrap the boundMethod definition in an anonymous
|
| + // function macro.
|
| + %FunctionSetName(boundMethod, '__bound' + methodName + '__');
|
| + %FunctionRemovePrototype(boundMethod);
|
| + %SetNativeFlag(boundMethod);
|
| + this[internalName] = boundMethod;
|
| + }
|
| + return this[internalName];
|
| + };
|
| +
|
| + InstallGetter(obj.prototype, methodName, getter, DONT_ENUM);
|
| +}
|
| +
|
| // -------------------------------------------------------------------
|
|
|
| var Intl = {};
|
| @@ -197,56 +268,6 @@ function GetTimezoneNameLocationPartRE() {
|
| return TIMEZONE_NAME_LOCATION_PART_RE;
|
| }
|
|
|
| -/**
|
| - * Adds bound method to the prototype of the given object.
|
| - */
|
| -function addBoundMethod(obj, methodName, implementation, length) {
|
| - %CheckIsBootstrapping();
|
| - var internalName = %CreatePrivateSymbol(methodName);
|
| - function getter() {
|
| - if (!%IsInitializedIntlObject(this)) {
|
| - throw MakeTypeError(kMethodCalledOnWrongObject, methodName);
|
| - }
|
| - if (IS_UNDEFINED(this[internalName])) {
|
| - var boundMethod;
|
| - if (IS_UNDEFINED(length) || length === 2) {
|
| - boundMethod = (x, y) => implementation(this, x, y);
|
| - } else if (length === 1) {
|
| - boundMethod = x => implementation(this, x);
|
| - } else {
|
| - boundMethod = (...args) => {
|
| - // DateTimeFormat.format needs to be 0 arg method, but can stil
|
| - // receive optional dateValue param. If one was provided, pass it
|
| - // along.
|
| - if (args.length > 0) {
|
| - return implementation(this, args[0]);
|
| - } else {
|
| - return implementation(this);
|
| - }
|
| - }
|
| - }
|
| - // TODO(littledan): Once function name reform is shipped, remove the
|
| - // following line and wrap the boundMethod definition in an anonymous
|
| - // function macro.
|
| - %FunctionSetName(boundMethod, '__bound' + methodName + '__');
|
| - %FunctionRemovePrototype(boundMethod);
|
| - %SetNativeFlag(boundMethod);
|
| - this[internalName] = boundMethod;
|
| - }
|
| - return this[internalName];
|
| - }
|
| -
|
| - %FunctionSetName(getter, methodName);
|
| - %FunctionRemovePrototype(getter);
|
| - %SetNativeFlag(getter);
|
| -
|
| - ObjectDefineProperty(obj.prototype, methodName, {
|
| - get: getter,
|
| - enumerable: false,
|
| - configurable: true
|
| - });
|
| -}
|
| -
|
|
|
| /**
|
| * Returns an intersection of locales and service supported locales.
|
| @@ -990,7 +1011,7 @@ function initializeCollator(collator, locales, options) {
|
| *
|
| * @constructor
|
| */
|
| -%AddNamedProperty(Intl, 'Collator', function() {
|
| +InstallConstructor(Intl, 'Collator', function() {
|
| var locales = arguments[0];
|
| var options = arguments[1];
|
|
|
| @@ -1000,15 +1021,14 @@ function initializeCollator(collator, locales, options) {
|
| }
|
|
|
| return initializeCollator(TO_OBJECT(this), locales, options);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
|
|
|
|
| /**
|
| * Collator resolvedOptions method.
|
| */
|
| -%AddNamedProperty(Intl.Collator.prototype, 'resolvedOptions', function() {
|
| +InstallFunction(Intl.Collator.prototype, 'resolvedOptions', function() {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
| @@ -1030,12 +1050,8 @@ function initializeCollator(collator, locales, options) {
|
| caseFirst: coll[resolvedSymbol].caseFirst,
|
| collation: coll[resolvedSymbol].collation
|
| };
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions');
|
| -%FunctionRemovePrototype(Intl.Collator.prototype.resolvedOptions);
|
| -%SetNativeFlag(Intl.Collator.prototype.resolvedOptions);
|
|
|
|
|
| /**
|
| @@ -1044,18 +1060,14 @@ function initializeCollator(collator, locales, options) {
|
| * order in the returned list as in the input list.
|
| * Options are optional parameter.
|
| */
|
| -%AddNamedProperty(Intl.Collator, 'supportedLocalesOf', function(locales) {
|
| +InstallFunction(Intl.Collator, 'supportedLocalesOf', function(locales) {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
|
|
| return supportedLocalesOf('collator', locales, arguments[1]);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf');
|
| -%FunctionRemovePrototype(Intl.Collator.supportedLocalesOf);
|
| -%SetNativeFlag(Intl.Collator.supportedLocalesOf);
|
|
|
|
|
| /**
|
| @@ -1074,7 +1086,7 @@ function compare(collator, x, y) {
|
| };
|
|
|
|
|
| -addBoundMethod(Intl.Collator, 'compare', compare, 2);
|
| +AddBoundMethod(Intl.Collator, 'compare', compare, 2);
|
|
|
| /**
|
| * Verifies that the input is a well-formed ISO 4217 currency code.
|
| @@ -1243,7 +1255,7 @@ function initializeNumberFormat(numberFormat, locales, options) {
|
| *
|
| * @constructor
|
| */
|
| -%AddNamedProperty(Intl, 'NumberFormat', function() {
|
| +InstallConstructor(Intl, 'NumberFormat', function() {
|
| var locales = arguments[0];
|
| var options = arguments[1];
|
|
|
| @@ -1253,15 +1265,14 @@ function initializeNumberFormat(numberFormat, locales, options) {
|
| }
|
|
|
| return initializeNumberFormat(TO_OBJECT(this), locales, options);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
|
|
|
|
| /**
|
| * NumberFormat resolvedOptions method.
|
| */
|
| -%AddNamedProperty(Intl.NumberFormat.prototype, 'resolvedOptions', function() {
|
| +InstallFunction(Intl.NumberFormat.prototype, 'resolvedOptions', function() {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
| @@ -1301,13 +1312,8 @@ function initializeNumberFormat(numberFormat, locales, options) {
|
| }
|
|
|
| return result;
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.NumberFormat.prototype.resolvedOptions,
|
| - 'resolvedOptions');
|
| -%FunctionRemovePrototype(Intl.NumberFormat.prototype.resolvedOptions);
|
| -%SetNativeFlag(Intl.NumberFormat.prototype.resolvedOptions);
|
|
|
|
|
| /**
|
| @@ -1316,18 +1322,14 @@ function initializeNumberFormat(numberFormat, locales, options) {
|
| * order in the returned list as in the input list.
|
| * Options are optional parameter.
|
| */
|
| -%AddNamedProperty(Intl.NumberFormat, 'supportedLocalesOf', function(locales) {
|
| +InstallFunction(Intl.NumberFormat, 'supportedLocalesOf', function(locales) {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
|
|
| return supportedLocalesOf('numberformat', locales, arguments[1]);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf');
|
| -%FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf);
|
| -%SetNativeFlag(Intl.NumberFormat.supportedLocalesOf);
|
|
|
|
|
| /**
|
| @@ -1353,8 +1355,8 @@ function parseNumber(formatter, value) {
|
| }
|
|
|
|
|
| -addBoundMethod(Intl.NumberFormat, 'format', formatNumber, 1);
|
| -addBoundMethod(Intl.NumberFormat, 'v8Parse', parseNumber, 1);
|
| +AddBoundMethod(Intl.NumberFormat, 'format', formatNumber, 1);
|
| +AddBoundMethod(Intl.NumberFormat, 'v8Parse', parseNumber, 1);
|
|
|
| /**
|
| * Returns a string that matches LDML representation of the options object.
|
| @@ -1647,7 +1649,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
|
| *
|
| * @constructor
|
| */
|
| -%AddNamedProperty(Intl, 'DateTimeFormat', function() {
|
| +InstallConstructor(Intl, 'DateTimeFormat', function() {
|
| var locales = arguments[0];
|
| var options = arguments[1];
|
|
|
| @@ -1657,15 +1659,14 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
|
| }
|
|
|
| return initializeDateTimeFormat(TO_OBJECT(this), locales, options);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
|
|
|
|
| /**
|
| * DateTimeFormat resolvedOptions method.
|
| */
|
| -%AddNamedProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', function() {
|
| +InstallFunction(Intl.DateTimeFormat.prototype, 'resolvedOptions', function() {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
| @@ -1724,13 +1725,8 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
|
| addWECPropertyIfDefined(result, 'second', fromPattern.second);
|
|
|
| return result;
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.DateTimeFormat.prototype.resolvedOptions,
|
| - 'resolvedOptions');
|
| -%FunctionRemovePrototype(Intl.DateTimeFormat.prototype.resolvedOptions);
|
| -%SetNativeFlag(Intl.DateTimeFormat.prototype.resolvedOptions);
|
|
|
|
|
| /**
|
| @@ -1739,18 +1735,14 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
|
| * order in the returned list as in the input list.
|
| * Options are optional parameter.
|
| */
|
| -%AddNamedProperty(Intl.DateTimeFormat, 'supportedLocalesOf', function(locales) {
|
| +InstallFunction(Intl.DateTimeFormat, 'supportedLocalesOf', function(locales) {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
|
|
| return supportedLocalesOf('dateformat', locales, arguments[1]);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf');
|
| -%FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf);
|
| -%SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf);
|
|
|
|
|
| /**
|
| @@ -1786,8 +1778,8 @@ function parseDate(formatter, value) {
|
|
|
|
|
| // 0 because date is optional argument.
|
| -addBoundMethod(Intl.DateTimeFormat, 'format', formatDate, 0);
|
| -addBoundMethod(Intl.DateTimeFormat, 'v8Parse', parseDate, 1);
|
| +AddBoundMethod(Intl.DateTimeFormat, 'format', formatDate, 0);
|
| +AddBoundMethod(Intl.DateTimeFormat, 'v8Parse', parseDate, 1);
|
|
|
|
|
| /**
|
| @@ -1874,7 +1866,7 @@ function initializeBreakIterator(iterator, locales, options) {
|
| *
|
| * @constructor
|
| */
|
| -%AddNamedProperty(Intl, 'v8BreakIterator', function() {
|
| +InstallConstructor(Intl, 'v8BreakIterator', function() {
|
| var locales = arguments[0];
|
| var options = arguments[1];
|
|
|
| @@ -1884,15 +1876,14 @@ function initializeBreakIterator(iterator, locales, options) {
|
| }
|
|
|
| return initializeBreakIterator(TO_OBJECT(this), locales, options);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
|
|
|
|
| /**
|
| * BreakIterator resolvedOptions method.
|
| */
|
| -%AddNamedProperty(Intl.v8BreakIterator.prototype, 'resolvedOptions',
|
| +InstallFunction(Intl.v8BreakIterator.prototype, 'resolvedOptions',
|
| function() {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| @@ -1911,13 +1902,8 @@ function initializeBreakIterator(iterator, locales, options) {
|
| locale: locale,
|
| type: segmenter[resolvedSymbol].type
|
| };
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.v8BreakIterator.prototype.resolvedOptions,
|
| - 'resolvedOptions');
|
| -%FunctionRemovePrototype(Intl.v8BreakIterator.prototype.resolvedOptions);
|
| -%SetNativeFlag(Intl.v8BreakIterator.prototype.resolvedOptions);
|
|
|
|
|
| /**
|
| @@ -1926,19 +1912,15 @@ function initializeBreakIterator(iterator, locales, options) {
|
| * order in the returned list as in the input list.
|
| * Options are optional parameter.
|
| */
|
| -%AddNamedProperty(Intl.v8BreakIterator, 'supportedLocalesOf',
|
| +InstallFunction(Intl.v8BreakIterator, 'supportedLocalesOf',
|
| function(locales) {
|
| if (!IS_UNDEFINED(new.target)) {
|
| throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor);
|
| }
|
|
|
| return supportedLocalesOf('breakiterator', locales, arguments[1]);
|
| - },
|
| - DONT_ENUM
|
| + }
|
| );
|
| -%FunctionSetName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf');
|
| -%FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf);
|
| -%SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf);
|
|
|
|
|
| /**
|
| @@ -1983,11 +1965,11 @@ function breakType(iterator) {
|
| }
|
|
|
|
|
| -addBoundMethod(Intl.v8BreakIterator, 'adoptText', adoptText, 1);
|
| -addBoundMethod(Intl.v8BreakIterator, 'first', first, 0);
|
| -addBoundMethod(Intl.v8BreakIterator, 'next', next, 0);
|
| -addBoundMethod(Intl.v8BreakIterator, 'current', current, 0);
|
| -addBoundMethod(Intl.v8BreakIterator, 'breakType', breakType, 0);
|
| +AddBoundMethod(Intl.v8BreakIterator, 'adoptText', adoptText, 1);
|
| +AddBoundMethod(Intl.v8BreakIterator, 'first', first, 0);
|
| +AddBoundMethod(Intl.v8BreakIterator, 'next', next, 0);
|
| +AddBoundMethod(Intl.v8BreakIterator, 'current', current, 0);
|
| +AddBoundMethod(Intl.v8BreakIterator, 'breakType', breakType, 0);
|
|
|
| // Save references to Intl objects and methods we use, for added security.
|
| var savedObjects = {
|
| @@ -2025,18 +2007,6 @@ function cachedOrNewService(service, locales, options, defaults) {
|
| return new savedObjects[service](locales, useOptions);
|
| }
|
|
|
| -
|
| -function OverrideFunction(object, name, f) {
|
| - %CheckIsBootstrapping();
|
| - ObjectDefineProperty(object, name, { value: f,
|
| - writeable: true,
|
| - configurable: true,
|
| - enumerable: false });
|
| - %FunctionSetName(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.
|
|
|