Bug 769871 - Reimplement String.localeCompare per ECMA-402. r=jwalden

This commit is contained in:
Norbert Lindenberg
2013-03-21 14:50:06 -07:00
parent 86e4e1a3ab
commit cd6b18f15e
9 changed files with 114 additions and 11 deletions

56
js/src/builtin/String.js Normal file
View File

@@ -0,0 +1,56 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*global intl_Collator: false, */
var collatorCache = new Record();
/**
* Compare this String against that String, using the locale and collation
* options provided.
*
* Spec: ECMAScript Internationalization API Specification, 13.1.1.
*/
function String_localeCompare(that) {
// Steps 1-3.
CheckObjectCoercible(this);
var S = ToString(this);
var That = ToString(that);
// Steps 4-5.
var locales = arguments.length > 1 ? arguments[1] : undefined;
var options = arguments.length > 2 ? arguments[2] : undefined;
// Step 6.
var collator;
if (locales === undefined && options === undefined) {
// This cache only optimizes for the old ES5 localeCompare without
// locales and options.
if (collatorCache.collator === undefined)
collatorCache.collator = intl_Collator(locales, options);
collator = collatorCache.collator;
} else {
collator = intl_Collator(locales, options);
}
// Step 7.
return intl_CompareStrings(collator, S, That);
}
/**
* Compare String str1 against String str2, using the locale and collation
* options provided.
*
* Mozilla proprietary.
* Spec: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String#String_generic_methods
*/
function String_static_localeCompare(str1, str2) {
if (arguments.length < 1)
ThrowError(JSMSG_MISSING_FUN_ARG, 0, "String.localeCompare");
var locales = arguments.length > 2 ? arguments[2] : undefined;
var options = arguments.length > 3 ? arguments[3] : undefined;
return callFunction(String_localeCompare, str1, str2, locales, options);
}