whole_func_string: function initializeCollator(collator, locales, options) {
    if (%IsInitializedIntlObject(collator)) {
      throw MakeTypeError(kReinitializeIntl, "Collator");
    }
  
    if (IS_UNDEFINED(options)) {
      options = {};
    }
  
    var getOption = getGetOption(options, 'collator');
  
    var internalOptions = {};
  
    defineWEProperty(internalOptions, 'usage', getOption(
      'usage', 'string', ['sort', 'search'], 'sort'));
  
    var sensitivity = getOption('sensitivity', 'string',
                                ['base', 'accent', 'case', 'variant']);
    if (IS_UNDEFINED(sensitivity) && internalOptions.usage === 'sort') {
      sensitivity = 'variant';
    }
    defineWEProperty(internalOptions, 'sensitivity', sensitivity);
  
    defineWEProperty(internalOptions, 'ignorePunctuation', getOption(
      'ignorePunctuation', 'boolean', UNDEFINED, false));
  
    var locale = resolveLocale('collator', locales, options);
  
    // ICU can't take kb, kc... parameters through localeID, so we need to pass
    // them as options.
    // One exception is -co- which has to be part of the extension, but only for
    // usage: sort, and its value can't be 'standard' or 'search'.
    var extensionMap = parseExtension(locale.extension);
  
    /**
     * Map of Unicode extensions to option properties, and their values and types,
     * for a collator.
     */
    var COLLATOR_KEY_MAP = {
      'kn': {'property': 'numeric', 'type': 'boolean'},
      'kf': {'property': 'caseFirst', 'type': 'string',
             'values': ['false', 'lower', 'upper']}
    };
  
    setOptions(
        options, extensionMap, COLLATOR_KEY_MAP, getOption, internalOptions);
  
    var collation = 'default';
    var extension = '';
    if (HAS_OWN_PROPERTY(extensionMap, 'co') && internalOptions.usage === 'sort') {
  
      /**
       * Allowed -u-co- values. List taken from:
       * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml
       */
      var ALLOWED_CO_VALUES = [
        'big5han', 'dict', 'direct', 'ducet', 'gb2312', 'phonebk', 'phonetic',
        'pinyin', 'reformed', 'searchjl', 'stroke', 'trad', 'unihan', 'zhuyin'
      ];
  
      if (%_Call(ArrayIndexOf, ALLOWED_CO_VALUES, extensionMap.co) !== -1) {
        extension = '-u-co-' + extensionMap.co;
        // ICU can't tell us what the collation is, so save user's input.
        collation = extensionMap.co;
      }
    } else if (internalOptions.usage === 'search') {
      extension = '-u-co-search';
    }
    defineWEProperty(internalOptions, 'collation', collation);
  
    var requestedLocale = locale.locale + extension;
  
    // We define all properties C++ code may produce, to prevent security
    // 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").
    // %object_define_properties will either succeed defining or throw an error.
    var resolved = %object_define_properties({}, {
      caseFirst: {writable: true},
      collation: {value: internalOptions.collation, writable: true},
      ignorePunctuation: {writable: true},
      locale: {writable: true},
      numeric: {writable: true},
      requestedLocale: {value: requestedLocale, writable: true},
      sensitivity: {writable: true},
      strength: {writable: true},
      usage: {value: internalOptions.usage, writable: true}
    });
  
    var internalCollator = %CreateCollator(requestedLocale,
                                           internalOptions,
                                           resolved);
  
    // Writable, configurable and enumerable are set to false by default.
    %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator);
    collator[resolvedSymbol] = resolved;
    if (FLAG_intl_extra) {
      %object_define_property(collator, 'resolved', resolvedAccessor);
    }
  
    return collator;
  }
func_code_string: function initializeCollator(collator, locales, options) {
    if (%IsInitializedIntlObject(collator)) {
      throw MakeTypeError(kReinitializeIntl, "Collator");
    }
  
    if (IS_UNDEFINED(options)) {
      options = {};
    }
  
    var getOption = getGetOption(options, 'collator');
  
    var internalOptions = {};
  
    defineWEProperty(internalOptions, 'usage', getOption(
      'usage', 'string', ['sort', 'search'], 'sort'));
  
    var sensitivity = getOption('sensitivity', 'string',
                                ['base', 'accent', 'case', 'variant']);
    if (IS_UNDEFINED(sensitivity) && internalOptions.usage === 'sort') {
      sensitivity = 'variant';
    }
    defineWEProperty(internalOptions, 'sensitivity', sensitivity);
  
    defineWEProperty(internalOptions, 'ignorePunctuation', getOption(
      'ignorePunctuation', 'boolean', UNDEFINED, false));
  
    var locale = resolveLocale('collator', locales, options);
  
    // ICU can't take kb, kc... parameters through localeID, so we need to pass
    // them as options.
    // One exception is -co- which has to be part of the extension, but only for
    // usage: sort, and its value can't be 'standard' or 'search'.
    var extensionMap = parseExtension(locale.extension);
  
    /**
     * Map of Unicode extensions to option properties, and their values and types,
     * for a collator.
     */
    var COLLATOR_KEY_MAP = {
      'kn': {'property': 'numeric', 'type': 'boolean'},
      'kf': {'property': 'caseFirst', 'type': 'string',
             'values': ['false', 'lower', 'upper']}
    };
  
    setOptions(
        options, extensionMap, COLLATOR_KEY_MAP, getOption, internalOptions);
  
    var collation = 'default';
    var extension = '';
    if (HAS_OWN_PROPERTY(extensionMap, 'co') && internalOptions.usage === 'sort') {
  
      /**
       * Allowed -u-co- values. List taken from:
       * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml
       */
      var ALLOWED_CO_VALUES = [
        'big5han', 'dict', 'direct', 'ducet', 'gb2312', 'phonebk', 'phonetic',
        'pinyin', 'reformed', 'searchjl', 'stroke', 'trad', 'unihan', 'zhuyin'
      ];
  
      if (%_Call(ArrayIndexOf, ALLOWED_CO_VALUES, extensionMap.co) !== -1) {
        extension = '-u-co-' + extensionMap.co;
        // ICU can't tell us what the collation is, so save user's input.
        collation = extensionMap.co;
      }
    } else if (internalOptions.usage === 'search') {
      extension = '-u-co-search';
    }
    defineWEProperty(internalOptions, 'collation', collation);
  
    var requestedLocale = locale.locale + extension;
  
    // We define all properties C++ code may produce, to prevent security
    // 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").
    // %object_define_properties will either succeed defining or throw an error.
    var resolved = %object_define_properties({}, {
      caseFirst: {writable: true},
      collation: {value: internalOptions.collation, writable: true},
      ignorePunctuation: {writable: true},
      locale: {writable: true},
      numeric: {writable: true},
      requestedLocale: {value: requestedLocale, writable: true},
      sensitivity: {writable: true},
      strength: {writable: true},
      usage: {value: internalOptions.usage, writable: true}
    });
  
    var internalCollator = %CreateCollator(requestedLocale,
                                           internalOptions,
                                           resolved);
  
    // Writable, configurable and enumerable are set to false by default.
    %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator);
    collator[resolvedSymbol] = resolved;
    if (FLAG_intl_extra) {
      %object_define_property(collator, 'resolved', resolvedAccessor);
    }
  
    return collator;
  }
func_documentation_string: Initializes the given object so it's a valid Collator instance.
  Useful for subclassing.