| Index: src/js/i18n.js
 | 
| diff --git a/src/js/i18n.js b/src/js/i18n.js
 | 
| index 4d56dd0623777f63e1b2f3df5aa49f06a0186f1e..4323cf6e8af526f03157513b61d4a556560dd8f5 100644
 | 
| --- a/src/js/i18n.js
 | 
| +++ b/src/js/i18n.js
 | 
| @@ -32,6 +32,7 @@ var IntlFallbackSymbol = utils.ImportNow("intl_fallback_symbol");
 | 
|  var InstallFunctions = utils.InstallFunctions;
 | 
|  var InstallGetter = utils.InstallGetter;
 | 
|  var InternalArray = utils.InternalArray;
 | 
| +var MaxSimple;
 | 
|  var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty");
 | 
|  var OverrideFunction = utils.OverrideFunction;
 | 
|  var patternSymbol = utils.ImportNow("intl_pattern_symbol");
 | 
| @@ -43,6 +44,7 @@ var StringSubstring = GlobalString.prototype.substring;
 | 
|  utils.Import(function(from) {
 | 
|    ArrayJoin = from.ArrayJoin;
 | 
|    ArrayPush = from.ArrayPush;
 | 
| +  MaxSimple = from.MaxSimple;
 | 
|  });
 | 
|  
 | 
|  // Utilities for definitions
 | 
| @@ -934,16 +936,6 @@ function BuildLanguageTagREs() {
 | 
|    LANGUAGE_TAG_RE = new GlobalRegExp(languageTag, 'i');
 | 
|  }
 | 
|  
 | 
| -var resolvedAccessor = {
 | 
| -  get() {
 | 
| -    %IncrementUseCounter(kIntlResolved);
 | 
| -    return this[resolvedSymbol];
 | 
| -  },
 | 
| -  set(value) {
 | 
| -    this[resolvedSymbol] = value;
 | 
| -  }
 | 
| -};
 | 
| -
 | 
|  // ECMA 402 section 8.2.1
 | 
|  InstallFunction(GlobalIntl, 'getCanonicalLocales', function(locales) {
 | 
|      return makeArray(canonicalizeLocaleList(locales));
 | 
| @@ -1137,7 +1129,6 @@ function defaultNumberOption(value, min, max, fallback, property) {
 | 
|    return fallback;
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /**
 | 
|   * Returns the valid digit count for a property, or throws RangeError on
 | 
|   * a value out of the range.
 | 
| @@ -1147,15 +1138,35 @@ function getNumberOption(options, property, min, max, fallback) {
 | 
|    return defaultNumberOption(value, min, max, fallback, property);
 | 
|  }
 | 
|  
 | 
| -var patternAccessor = {
 | 
| -  get() {
 | 
| -    %IncrementUseCounter(kIntlPattern);
 | 
| -    return this[patternSymbol];
 | 
| -  },
 | 
| -  set(value) {
 | 
| -    this[patternSymbol] = value;
 | 
| +// ECMA 402 #sec-setnfdigitoptions
 | 
| +// SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault )
 | 
| +function SetNumberFormatDigitOptions(internalOptions, options,
 | 
| +                                     mnfdDefault, mxfdDefault) {
 | 
| +  // Digit ranges.
 | 
| +  var mnid = getNumberOption(options, 'minimumIntegerDigits', 1, 21, 1);
 | 
| +  defineWEProperty(internalOptions, 'minimumIntegerDigits', mnid);
 | 
| +
 | 
| +  var mnfd = getNumberOption(options, 'minimumFractionDigits', 0, 20,
 | 
| +                             mnfdDefault);
 | 
| +  defineWEProperty(internalOptions, 'minimumFractionDigits', mnfd);
 | 
| +
 | 
| +  var mxfdActualDefault = MaxSimple(mnfd, mxfdDefault);
 | 
| +
 | 
| +  var mxfd = getNumberOption(options, 'maximumFractionDigits', mnfd, 20,
 | 
| +                             mxfdActualDefault);
 | 
| +
 | 
| +  defineWEProperty(internalOptions, 'maximumFractionDigits', mxfd);
 | 
| +
 | 
| +  var mnsd = options['minimumSignificantDigits'];
 | 
| +  var mxsd = options['maximumSignificantDigits'];
 | 
| +  if (!IS_UNDEFINED(mnsd) || !IS_UNDEFINED(mxsd)) {
 | 
| +    mnsd = defaultNumberOption(mnsd, 1, 21, 1, 'minimumSignificantDigits');
 | 
| +    defineWEProperty(internalOptions, 'minimumSignificantDigits', mnsd);
 | 
| +
 | 
| +    mxsd = defaultNumberOption(mxsd, mnsd, 21, 21, 'maximumSignificantDigits');
 | 
| +    defineWEProperty(internalOptions, 'maximumSignificantDigits', mxsd);
 | 
|    }
 | 
| -};
 | 
| +}
 | 
|  
 | 
|  /**
 | 
|   * Initializes the given object so it's a valid NumberFormat instance.
 | 
| @@ -1183,41 +1194,22 @@ function CreateNumberFormat(locales, options) {
 | 
|      throw %make_type_error(kCurrencyCode);
 | 
|    }
 | 
|  
 | 
| +  var mnfdDefault, mxfdDefault;
 | 
| +
 | 
|    var currencyDisplay = getOption(
 | 
|        'currencyDisplay', 'string', ['code', 'symbol', 'name'], 'symbol');
 | 
|    if (internalOptions.style === 'currency') {
 | 
|      defineWEProperty(internalOptions, 'currency', %StringToUpperCaseI18N(currency));
 | 
|      defineWEProperty(internalOptions, 'currencyDisplay', currencyDisplay);
 | 
| -  }
 | 
| -
 | 
| -  // Digit ranges.
 | 
| -  var mnid = getNumberOption(options, 'minimumIntegerDigits', 1, 21, 1);
 | 
| -  defineWEProperty(internalOptions, 'minimumIntegerDigits', mnid);
 | 
| -
 | 
| -  var mnfd = options['minimumFractionDigits'];
 | 
| -  var mxfd = options['maximumFractionDigits'];
 | 
| -  if (!IS_UNDEFINED(mnfd) || internalOptions.style !== 'currency') {
 | 
| -    mnfd = getNumberOption(options, 'minimumFractionDigits', 0, 20, 0);
 | 
| -    defineWEProperty(internalOptions, 'minimumFractionDigits', mnfd);
 | 
| -  }
 | 
|  
 | 
| -  if (!IS_UNDEFINED(mxfd) || internalOptions.style !== 'currency') {
 | 
| -    var min_mxfd = internalOptions.style === 'percent' ? 0 : 3;
 | 
| -    mnfd = IS_UNDEFINED(mnfd) ? 0 : mnfd;
 | 
| -    var fallback_limit = (mnfd > min_mxfd) ? mnfd : min_mxfd;
 | 
| -    mxfd = getNumberOption(options, 'maximumFractionDigits', mnfd, 20, fallback_limit);
 | 
| -    defineWEProperty(internalOptions, 'maximumFractionDigits', mxfd);
 | 
| +    mnfdDefault = mxfdDefault = %CurrencyDigits(internalOptions.currency);
 | 
| +  } else {
 | 
| +    mnfdDefault = 0;
 | 
| +    mxfdDefault = internalOptions.style === 'percent' ? 0 : 3;
 | 
|    }
 | 
|  
 | 
| -  var mnsd = options['minimumSignificantDigits'];
 | 
| -  var mxsd = options['maximumSignificantDigits'];
 | 
| -  if (!IS_UNDEFINED(mnsd) || !IS_UNDEFINED(mxsd)) {
 | 
| -    mnsd = defaultNumberOption(mnsd, 1, 21, 1, 'minimumSignificantDigits');
 | 
| -    defineWEProperty(internalOptions, 'minimumSignificantDigits', mnsd);
 | 
| -
 | 
| -    mxsd = defaultNumberOption(mxsd, mnsd, 21, 21, 'maximumSignificantDigits');
 | 
| -    defineWEProperty(internalOptions, 'maximumSignificantDigits', mxsd);
 | 
| -  }
 | 
| +  SetNumberFormatDigitOptions(internalOptions, options, mnfdDefault,
 | 
| +                              mxfdDefault);
 | 
|  
 | 
|    // Grouping.
 | 
|    defineWEProperty(internalOptions, 'useGrouping', getOption(
 | 
| 
 |