Bug 769871 - Reimplement String.localeCompare per ECMA-402. r=jwalden
This commit is contained in:
56
js/src/builtin/String.js
Normal file
56
js/src/builtin/String.js
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user