summaryrefslogtreecommitdiffstats
path: root/js/src/builtin
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/builtin')
-rw-r--r--js/src/builtin/Array.js8
-rw-r--r--js/src/builtin/Intl.cpp602
-rw-r--r--js/src/builtin/Intl.h4
-rw-r--r--js/src/builtin/Intl.js126
-rw-r--r--js/src/builtin/String.js6
-rw-r--r--js/src/builtin/TestingFunctions.cpp4
-rw-r--r--js/src/builtin/TypedArray.js8
7 files changed, 126 insertions, 632 deletions
diff --git a/js/src/builtin/Array.js b/js/src/builtin/Array.js
index 45f90a7b8..360dd2af1 100644
--- a/js/src/builtin/Array.js
+++ b/js/src/builtin/Array.js
@@ -900,11 +900,7 @@ function ArrayToLocaleString(locales, options) {
if (firstElement === undefined || firstElement === null) {
R = "";
} else {
-#if EXPOSE_INTL_API
R = ToString(callContentFunction(firstElement.toLocaleString, firstElement, locales, options));
-#else
- R = ToString(callContentFunction(firstElement.toLocaleString, firstElement));
-#endif
}
// Step 3 (reordered).
@@ -919,11 +915,7 @@ function ArrayToLocaleString(locales, options) {
// Steps 9.a, 9.c-e.
R += separator;
if (!(nextElement === undefined || nextElement === null)) {
-#if EXPOSE_INTL_API
R += ToString(callContentFunction(nextElement.toLocaleString, nextElement, locales, options));
-#else
- R += ToString(callContentFunction(nextElement.toLocaleString, nextElement));
-#endif
}
}
diff --git a/js/src/builtin/Intl.cpp b/js/src/builtin/Intl.cpp
index cd808cb10..71f7b58d4 100644
--- a/js/src/builtin/Intl.cpp
+++ b/js/src/builtin/Intl.cpp
@@ -23,7 +23,6 @@
#include "jsobj.h"
#include "builtin/IntlTimeZoneData.h"
-#if ENABLE_INTL_API
#include "unicode/ucal.h"
#include "unicode/ucol.h"
#include "unicode/udat.h"
@@ -32,7 +31,6 @@
#include "unicode/unum.h"
#include "unicode/unumsys.h"
#include "unicode/ustring.h"
-#endif
#include "vm/DateTime.h"
#include "vm/GlobalObject.h"
#include "vm/Interpreter.h"
@@ -60,603 +58,6 @@ using mozilla::PodCopy;
* http://userguide.icu-project.org/design#TOC-Error-Handling
*/
-
-/******************** ICU stubs ********************/
-
-#if !ENABLE_INTL_API
-
-/*
- * When the Internationalization API isn't enabled, we also shouldn't link
- * against ICU. However, we still want to compile this code in order to prevent
- * bit rot. The following stub implementations for ICU functions make this
- * possible. The functions using them should never be called, so they assert
- * and return error codes. Signatures adapted from ICU header files locid.h,
- * numsys.h, ucal.h, ucol.h, udat.h, udatpg.h, uenum.h, unum.h; see the ICU
- * directory for license.
- */
-
-typedef bool UBool;
-typedef char16_t UChar;
-typedef double UDate;
-
-enum UErrorCode {
- U_ZERO_ERROR,
- U_BUFFER_OVERFLOW_ERROR,
-};
-
-static inline UBool
-U_FAILURE(UErrorCode code)
-{
- MOZ_CRASH("U_FAILURE: Intl API disabled");
-}
-
-inline const UChar*
-Char16ToUChar(const char16_t* chars)
-{
- MOZ_CRASH("Char16ToUChar: Intl API disabled");
-}
-
-inline UChar*
-Char16ToUChar(char16_t* chars)
-{
- MOZ_CRASH("Char16ToUChar: Intl API disabled");
-}
-
-inline char16_t*
-UCharToChar16(UChar* chars)
-{
- MOZ_CRASH("UCharToChar16: Intl API disabled");
-}
-
-inline const char16_t*
-UCharToChar16(const UChar* chars)
-{
- MOZ_CRASH("UCharToChar16: Intl API disabled");
-}
-
-static int32_t
-u_strlen(const UChar* s)
-{
- MOZ_CRASH("u_strlen: Intl API disabled");
-}
-
-struct UEnumeration;
-
-static int32_t
-uenum_count(UEnumeration* en, UErrorCode* status)
-{
- MOZ_CRASH("uenum_count: Intl API disabled");
-}
-
-static const char*
-uenum_next(UEnumeration* en, int32_t* resultLength, UErrorCode* status)
-{
- MOZ_CRASH("uenum_next: Intl API disabled");
-}
-
-static void
-uenum_close(UEnumeration* en)
-{
- MOZ_CRASH("uenum_close: Intl API disabled");
-}
-
-struct UCollator;
-
-enum UColAttribute {
- UCOL_ALTERNATE_HANDLING,
- UCOL_CASE_FIRST,
- UCOL_CASE_LEVEL,
- UCOL_NORMALIZATION_MODE,
- UCOL_STRENGTH,
- UCOL_NUMERIC_COLLATION,
-};
-
-enum UColAttributeValue {
- UCOL_DEFAULT = -1,
- UCOL_PRIMARY = 0,
- UCOL_SECONDARY = 1,
- UCOL_TERTIARY = 2,
- UCOL_OFF = 16,
- UCOL_ON = 17,
- UCOL_SHIFTED = 20,
- UCOL_LOWER_FIRST = 24,
- UCOL_UPPER_FIRST = 25,
-};
-
-enum UCollationResult {
- UCOL_EQUAL = 0,
- UCOL_GREATER = 1,
- UCOL_LESS = -1
-};
-
-static int32_t
-ucol_countAvailable()
-{
- MOZ_CRASH("ucol_countAvailable: Intl API disabled");
-}
-
-static const char*
-ucol_getAvailable(int32_t localeIndex)
-{
- MOZ_CRASH("ucol_getAvailable: Intl API disabled");
-}
-
-static UCollator*
-ucol_open(const char* loc, UErrorCode* status)
-{
- MOZ_CRASH("ucol_open: Intl API disabled");
-}
-
-static void
-ucol_setAttribute(UCollator* coll, UColAttribute attr, UColAttributeValue value, UErrorCode* status)
-{
- MOZ_CRASH("ucol_setAttribute: Intl API disabled");
-}
-
-static UCollationResult
-ucol_strcoll(const UCollator* coll, const UChar* source, int32_t sourceLength,
- const UChar* target, int32_t targetLength)
-{
- MOZ_CRASH("ucol_strcoll: Intl API disabled");
-}
-
-static void
-ucol_close(UCollator* coll)
-{
- MOZ_CRASH("ucol_close: Intl API disabled");
-}
-
-static UEnumeration*
-ucol_getKeywordValuesForLocale(const char* key, const char* locale, UBool commonlyUsed,
- UErrorCode* status)
-{
- MOZ_CRASH("ucol_getKeywordValuesForLocale: Intl API disabled");
-}
-
-struct UParseError;
-struct UFieldPosition;
-struct UFieldPositionIterator;
-typedef void* UNumberFormat;
-
-enum UNumberFormatStyle {
- UNUM_DECIMAL = 1,
- UNUM_CURRENCY,
- UNUM_PERCENT,
- UNUM_CURRENCY_ISO,
- UNUM_CURRENCY_PLURAL,
-};
-
-enum UNumberFormatRoundingMode {
- UNUM_ROUND_HALFUP,
-};
-
-enum UNumberFormatAttribute {
- UNUM_GROUPING_USED,
- UNUM_MIN_INTEGER_DIGITS,
- UNUM_MAX_FRACTION_DIGITS,
- UNUM_MIN_FRACTION_DIGITS,
- UNUM_ROUNDING_MODE,
- UNUM_SIGNIFICANT_DIGITS_USED,
- UNUM_MIN_SIGNIFICANT_DIGITS,
- UNUM_MAX_SIGNIFICANT_DIGITS,
-};
-
-enum UNumberFormatTextAttribute {
- UNUM_CURRENCY_CODE,
-};
-
-static int32_t
-unum_countAvailable()
-{
- MOZ_CRASH("unum_countAvailable: Intl API disabled");
-}
-
-static const char*
-unum_getAvailable(int32_t localeIndex)
-{
- MOZ_CRASH("unum_getAvailable: Intl API disabled");
-}
-
-static UNumberFormat*
-unum_open(UNumberFormatStyle style, const UChar* pattern, int32_t patternLength,
- const char* locale, UParseError* parseErr, UErrorCode* status)
-{
- MOZ_CRASH("unum_open: Intl API disabled");
-}
-
-static void
-unum_setAttribute(UNumberFormat* fmt, UNumberFormatAttribute attr, int32_t newValue)
-{
- MOZ_CRASH("unum_setAttribute: Intl API disabled");
-}
-
-static int32_t
-unum_formatDouble(const UNumberFormat* fmt, double number, UChar* result,
- int32_t resultLength, UFieldPosition* pos, UErrorCode* status)
-{
- MOZ_CRASH("unum_formatDouble: Intl API disabled");
-}
-
-static void
-unum_close(UNumberFormat* fmt)
-{
- MOZ_CRASH("unum_close: Intl API disabled");
-}
-
-static void
-unum_setTextAttribute(UNumberFormat* fmt, UNumberFormatTextAttribute tag, const UChar* newValue,
- int32_t newValueLength, UErrorCode* status)
-{
- MOZ_CRASH("unum_setTextAttribute: Intl API disabled");
-}
-
-typedef void* UNumberingSystem;
-
-static UNumberingSystem*
-unumsys_open(const char* locale, UErrorCode* status)
-{
- MOZ_CRASH("unumsys_open: Intl API disabled");
-}
-
-static const char*
-unumsys_getName(const UNumberingSystem* unumsys)
-{
- MOZ_CRASH("unumsys_getName: Intl API disabled");
-}
-
-static void
-unumsys_close(UNumberingSystem* unumsys)
-{
- MOZ_CRASH("unumsys_close: Intl API disabled");
-}
-
-typedef void* UCalendar;
-
-enum UCalendarType {
- UCAL_TRADITIONAL,
- UCAL_DEFAULT = UCAL_TRADITIONAL,
- UCAL_GREGORIAN
-};
-
-enum UCalendarAttribute {
- UCAL_FIRST_DAY_OF_WEEK,
- UCAL_MINIMAL_DAYS_IN_FIRST_WEEK
-};
-
-enum UCalendarDaysOfWeek {
- UCAL_SUNDAY,
- UCAL_MONDAY,
- UCAL_TUESDAY,
- UCAL_WEDNESDAY,
- UCAL_THURSDAY,
- UCAL_FRIDAY,
- UCAL_SATURDAY
-};
-
-enum UCalendarWeekdayType {
- UCAL_WEEKDAY,
- UCAL_WEEKEND,
- UCAL_WEEKEND_ONSET,
- UCAL_WEEKEND_CEASE
-};
-
-enum UCalendarDateFields {
- UCAL_ERA,
- UCAL_YEAR,
- UCAL_MONTH,
- UCAL_WEEK_OF_YEAR,
- UCAL_WEEK_OF_MONTH,
- UCAL_DATE,
- UCAL_DAY_OF_YEAR,
- UCAL_DAY_OF_WEEK,
- UCAL_DAY_OF_WEEK_IN_MONTH,
- UCAL_AM_PM,
- UCAL_HOUR,
- UCAL_HOUR_OF_DAY,
- UCAL_MINUTE,
- UCAL_SECOND,
- UCAL_MILLISECOND,
- UCAL_ZONE_OFFSET,
- UCAL_DST_OFFSET,
- UCAL_YEAR_WOY,
- UCAL_DOW_LOCAL,
- UCAL_EXTENDED_YEAR,
- UCAL_JULIAN_DAY,
- UCAL_MILLISECONDS_IN_DAY,
- UCAL_IS_LEAP_MONTH,
- UCAL_FIELD_COUNT,
- UCAL_DAY_OF_MONTH = UCAL_DATE
-};
-
-enum UCalendarMonths {
- UCAL_JANUARY,
- UCAL_FEBRUARY,
- UCAL_MARCH,
- UCAL_APRIL,
- UCAL_MAY,
- UCAL_JUNE,
- UCAL_JULY,
- UCAL_AUGUST,
- UCAL_SEPTEMBER,
- UCAL_OCTOBER,
- UCAL_NOVEMBER,
- UCAL_DECEMBER,
- UCAL_UNDECIMBER
-};
-
-enum UCalendarAMPMs {
- UCAL_AM,
- UCAL_PM
-};
-
-static UCalendar*
-ucal_open(const UChar* zoneID, int32_t len, const char* locale,
- UCalendarType type, UErrorCode* status)
-{
- MOZ_CRASH("ucal_open: Intl API disabled");
-}
-
-static const char*
-ucal_getType(const UCalendar* cal, UErrorCode* status)
-{
- MOZ_CRASH("ucal_getType: Intl API disabled");
-}
-
-static UEnumeration*
-ucal_getKeywordValuesForLocale(const char* key, const char* locale,
- UBool commonlyUsed, UErrorCode* status)
-{
- MOZ_CRASH("ucal_getKeywordValuesForLocale: Intl API disabled");
-}
-
-static void
-ucal_close(UCalendar* cal)
-{
- MOZ_CRASH("ucal_close: Intl API disabled");
-}
-
-static UCalendarWeekdayType
-ucal_getDayOfWeekType(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode* status)
-{
- MOZ_CRASH("ucal_getDayOfWeekType: Intl API disabled");
-}
-
-static int32_t
-ucal_getAttribute(const UCalendar* cal,
- UCalendarAttribute attr)
-{
- MOZ_CRASH("ucal_getAttribute: Intl API disabled");
-}
-
-static int32_t
-ucal_get(const UCalendar *cal, UCalendarDateFields field, UErrorCode *status)
-{
- MOZ_CRASH("ucal_get: Intl API disabled");
-}
-
-static UEnumeration*
-ucal_openTimeZones(UErrorCode* status)
-{
- MOZ_CRASH("ucal_openTimeZones: Intl API disabled");
-}
-
-static int32_t
-ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len, UChar* result, int32_t resultCapacity,
- UBool* isSystemID, UErrorCode* status)
-{
- MOZ_CRASH("ucal_getCanonicalTimeZoneID: Intl API disabled");
-}
-
-static int32_t
-ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* status)
-{
- MOZ_CRASH("ucal_getDefaultTimeZone: Intl API disabled");
-}
-
-enum UDateTimePatternField {
- UDATPG_YEAR_FIELD,
- UDATPG_MONTH_FIELD,
- UDATPG_WEEK_OF_YEAR_FIELD,
- UDATPG_DAY_FIELD,
-};
-
-typedef void* UDateTimePatternGenerator;
-
-static UDateTimePatternGenerator*
-udatpg_open(const char* locale, UErrorCode* pErrorCode)
-{
- MOZ_CRASH("udatpg_open: Intl API disabled");
-}
-
-static int32_t
-udatpg_getBestPattern(UDateTimePatternGenerator* dtpg, const UChar* skeleton,
- int32_t length, UChar* bestPattern, int32_t capacity,
- UErrorCode* pErrorCode)
-{
- MOZ_CRASH("udatpg_getBestPattern: Intl API disabled");
-}
-
-static const UChar *
-udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg,
- UDateTimePatternField field,
- int32_t *pLength)
-{
- MOZ_CRASH("udatpg_getAppendItemName: Intl API disabled");
-}
-
-static void
-udatpg_close(UDateTimePatternGenerator* dtpg)
-{
- MOZ_CRASH("udatpg_close: Intl API disabled");
-}
-
-typedef void* UCalendar;
-typedef void* UDateFormat;
-
-enum UDateFormatField {
- UDAT_ERA_FIELD = 0,
- UDAT_YEAR_FIELD = 1,
- UDAT_MONTH_FIELD = 2,
- UDAT_DATE_FIELD = 3,
- UDAT_HOUR_OF_DAY1_FIELD = 4,
- UDAT_HOUR_OF_DAY0_FIELD = 5,
- UDAT_MINUTE_FIELD = 6,
- UDAT_SECOND_FIELD = 7,
- UDAT_FRACTIONAL_SECOND_FIELD = 8,
- UDAT_DAY_OF_WEEK_FIELD = 9,
- UDAT_DAY_OF_YEAR_FIELD = 10,
- UDAT_DAY_OF_WEEK_IN_MONTH_FIELD = 11,
- UDAT_WEEK_OF_YEAR_FIELD = 12,
- UDAT_WEEK_OF_MONTH_FIELD = 13,
- UDAT_AM_PM_FIELD = 14,
- UDAT_HOUR1_FIELD = 15,
- UDAT_HOUR0_FIELD = 16,
- UDAT_TIMEZONE_FIELD = 17,
- UDAT_YEAR_WOY_FIELD = 18,
- UDAT_DOW_LOCAL_FIELD = 19,
- UDAT_EXTENDED_YEAR_FIELD = 20,
- UDAT_JULIAN_DAY_FIELD = 21,
- UDAT_MILLISECONDS_IN_DAY_FIELD = 22,
- UDAT_TIMEZONE_RFC_FIELD = 23,
- UDAT_TIMEZONE_GENERIC_FIELD = 24,
- UDAT_STANDALONE_DAY_FIELD = 25,
- UDAT_STANDALONE_MONTH_FIELD = 26,
- UDAT_QUARTER_FIELD = 27,
- UDAT_STANDALONE_QUARTER_FIELD = 28,
- UDAT_TIMEZONE_SPECIAL_FIELD = 29,
- UDAT_YEAR_NAME_FIELD = 30,
- UDAT_TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD = 31,
- UDAT_TIMEZONE_ISO_FIELD = 32,
- UDAT_TIMEZONE_ISO_LOCAL_FIELD = 33,
- UDAT_RELATED_YEAR_FIELD = 34,
- UDAT_AM_PM_MIDNIGHT_NOON_FIELD = 35,
- UDAT_FLEXIBLE_DAY_PERIOD_FIELD = 36,
- UDAT_TIME_SEPARATOR_FIELD = 37,
- UDAT_FIELD_COUNT = 38
-};
-
-enum UDateFormatStyle {
- UDAT_FULL,
- UDAT_LONG,
- UDAT_MEDIUM,
- UDAT_SHORT,
- UDAT_DEFAULT = UDAT_MEDIUM,
- UDAT_PATTERN = -2,
- UDAT_IGNORE = UDAT_PATTERN
-};
-
-enum UDateFormatSymbolType {
- UDAT_ERAS,
- UDAT_MONTHS,
- UDAT_SHORT_MONTHS,
- UDAT_WEEKDAYS,
- UDAT_SHORT_WEEKDAYS,
- UDAT_AM_PMS,
- UDAT_LOCALIZED_CHARS,
- UDAT_ERA_NAMES,
- UDAT_NARROW_MONTHS,
- UDAT_NARROW_WEEKDAYS,
- UDAT_STANDALONE_MONTHS,
- UDAT_STANDALONE_SHORT_MONTHS,
- UDAT_STANDALONE_NARROW_MONTHS,
- UDAT_STANDALONE_WEEKDAYS,
- UDAT_STANDALONE_SHORT_WEEKDAYS,
- UDAT_STANDALONE_NARROW_WEEKDAYS,
- UDAT_QUARTERS,
- UDAT_SHORT_QUARTERS,
- UDAT_STANDALONE_QUARTERS,
- UDAT_STANDALONE_SHORT_QUARTERS,
- UDAT_SHORTER_WEEKDAYS,
- UDAT_STANDALONE_SHORTER_WEEKDAYS,
- UDAT_CYCLIC_YEARS_WIDE,
- UDAT_CYCLIC_YEARS_ABBREVIATED,
- UDAT_CYCLIC_YEARS_NARROW,
- UDAT_ZODIAC_NAMES_WIDE,
- UDAT_ZODIAC_NAMES_ABBREVIATED,
- UDAT_ZODIAC_NAMES_NARROW
-};
-
-static int32_t
-udat_countAvailable()
-{
- MOZ_CRASH("udat_countAvailable: Intl API disabled");
-}
-
-static const char*
-udat_getAvailable(int32_t localeIndex)
-{
- MOZ_CRASH("udat_getAvailable: Intl API disabled");
-}
-
-static UDateFormat*
-udat_open(UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const char* locale,
- const UChar* tzID, int32_t tzIDLength, const UChar* pattern,
- int32_t patternLength, UErrorCode* status)
-{
- MOZ_CRASH("udat_open: Intl API disabled");
-}
-
-static const UCalendar*
-udat_getCalendar(const UDateFormat* fmt)
-{
- MOZ_CRASH("udat_getCalendar: Intl API disabled");
-}
-
-static void
-ucal_setGregorianChange(UCalendar* cal, UDate date, UErrorCode* pErrorCode)
-{
- MOZ_CRASH("ucal_setGregorianChange: Intl API disabled");
-}
-
-static int32_t
-udat_format(const UDateFormat* format, UDate dateToFormat, UChar* result,
- int32_t resultLength, UFieldPosition* position, UErrorCode* status)
-{
- MOZ_CRASH("udat_format: Intl API disabled");
-}
-
-static int32_t
-udat_formatForFields(const UDateFormat* format, UDate dateToFormat,
- UChar* result, int32_t resultLength, UFieldPositionIterator* fpositer,
- UErrorCode* status)
-{
- MOZ_CRASH("udat_formatForFields: Intl API disabled");
-}
-
-static UFieldPositionIterator*
-ufieldpositer_open(UErrorCode* status)
-{
- MOZ_CRASH("ufieldpositer_open: Intl API disabled");
-}
-
-static void
-ufieldpositer_close(UFieldPositionIterator* fpositer)
-{
- MOZ_CRASH("ufieldpositer_close: Intl API disabled");
-}
-
-static int32_t
-ufieldpositer_next(UFieldPositionIterator* fpositer, int32_t* beginIndex, int32_t* endIndex)
-{
- MOZ_CRASH("ufieldpositer_next: Intl API disabled");
-}
-
-static void
-udat_close(UDateFormat* format)
-{
- MOZ_CRASH("udat_close: Intl API disabled");
-}
-
-static int32_t
-udat_getSymbols(const UDateFormat *fmt, UDateFormatSymbolType type, int32_t symbolIndex,
- UChar *result, int32_t resultLength, UErrorCode *status)
-{
- MOZ_CRASH("udat_getSymbols: Intl API disabled");
-}
-
-#endif
-
-
/******************** Common to Intl constructors ********************/
static bool
@@ -706,7 +107,6 @@ intl_availableLocales(JSContext* cx, CountAvailable countAvailable,
if (!locales)
return false;
-#if ENABLE_INTL_API
uint32_t count = countAvailable();
RootedValue t(cx, BooleanValue(true));
for (uint32_t i = 0; i < count; i++) {
@@ -726,7 +126,7 @@ intl_availableLocales(JSContext* cx, CountAvailable countAvailable,
return false;
}
}
-#endif
+
result.setObject(*locales);
return true;
}
diff --git a/js/src/builtin/Intl.h b/js/src/builtin/Intl.h
index b2197060d..9a1e44913 100644
--- a/js/src/builtin/Intl.h
+++ b/js/src/builtin/Intl.h
@@ -16,9 +16,7 @@
#include "js/GCAPI.h"
#include "js/GCHashTable.h"
-#if ENABLE_INTL_API
#include "unicode/utypes.h"
-#endif
/*
* The Intl module specified by standard ECMA-402,
@@ -429,7 +427,6 @@ intl_GetCalendarInfo(JSContext* cx, unsigned argc, Value* vp);
extern MOZ_MUST_USE bool
intl_ComputeDisplayNames(JSContext* cx, unsigned argc, Value* vp);
-#if ENABLE_INTL_API
/**
* Cast char16_t* strings to UChar* strings used by ICU.
*/
@@ -456,7 +453,6 @@ UCharToChar16(const UChar* chars)
{
return reinterpret_cast<const char16_t*>(chars);
}
-#endif // ENABLE_INTL_API
} // namespace js
diff --git a/js/src/builtin/Intl.js b/js/src/builtin/Intl.js
index 509168d7a..6391c3e70 100644
--- a/js/src/builtin/Intl.js
+++ b/js/src/builtin/Intl.js
@@ -9,7 +9,8 @@
JSMSG_INVALID_OPTION_VALUE: false, JSMSG_INVALID_DIGITS_VALUE: false,
JSMSG_INTL_OBJECT_REINITED: false, JSMSG_INVALID_CURRENCY_CODE: false,
JSMSG_UNDEFINED_CURRENCY: false, JSMSG_INVALID_TIME_ZONE: false,
- JSMSG_DATE_NOT_FINITE: false,
+ JSMSG_DATE_NOT_FINITE: false, JSMSG_INVALID_KEYS_TYPE: false,
+ JSMSG_INVALID_KEY: false,
intl_Collator_availableLocales: false,
intl_availableCollations: false,
intl_CompareStrings: false,
@@ -3024,3 +3025,126 @@ function Intl_getCalendarInfo(locales) {
return result;
}
+
+/**
+ * This function is a custom method designed after Intl API, but currently
+ * not part of the spec or spec proposal.
+ * We want to use it internally to retrieve translated values from CLDR in
+ * order to ensure they're aligned with what Intl API returns.
+ *
+ * This API may one day be a foundation for an ECMA402 API spec proposal.
+ *
+ * The function takes two arguments - locales which is a list of locale strings
+ * and options which is an object with two optional properties:
+ *
+ * keys:
+ * an Array of string values that are paths to individual terms
+ *
+ * style:
+ * a String with a value "long", "short" or "narrow"
+ *
+ * It returns an object with properties:
+ *
+ * locale:
+ * a negotiated locale string
+ *
+ * style:
+ * negotiated style
+ *
+ * values:
+ * A key-value pair list of requested keys and corresponding
+ * translated values
+ *
+ */
+function Intl_getDisplayNames(locales, options) {
+ // 1. Let requestLocales be ? CanonicalizeLocaleList(locales).
+ const requestedLocales = CanonicalizeLocaleList(locales);
+
+ // 2. If options is undefined, then
+ if (options === undefined)
+ // a. Let options be ObjectCreate(%ObjectPrototype%).
+ options = {};
+ // 3. Else,
+ else
+ // a. Let options be ? ToObject(options).
+ options = ToObject(options);
+
+ const DateTimeFormat = dateTimeFormatInternalProperties;
+
+ // 4. Let localeData be %DateTimeFormat%.[[localeData]].
+ const localeData = DateTimeFormat.localeData;
+
+ // 5. Let opt be a new Record.
+ const localeOpt = new Record();
+ // 6. Set localeOpt.[[localeMatcher]] to "best fit".
+ localeOpt.localeMatcher = "best fit";
+
+ // 7. Let r be ResolveLocale(%DateTimeFormat%.[[availableLocales]], requestedLocales, localeOpt,
+ // %DateTimeFormat%.[[relevantExtensionKeys]], localeData).
+ const r = ResolveLocale(callFunction(DateTimeFormat.availableLocales, DateTimeFormat),
+ requestedLocales,
+ localeOpt,
+ DateTimeFormat.relevantExtensionKeys,
+ localeData);
+
+ // 8. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow" », "long").
+ const style = GetOption(options, "style", "string", ["long", "short", "narrow"], "long");
+ // 9. Let keys be ? Get(options, "keys").
+ let keys = options.keys;
+
+ // 10. If keys is undefined,
+ if (keys === undefined) {
+ // a. Let keys be ArrayCreate(0).
+ keys = [];
+ } else if (!IsObject(keys)) {
+ // 11. Else,
+ // a. If Type(keys) is not Object, throw a TypeError exception.
+ ThrowTypeError(JSMSG_INVALID_KEYS_TYPE);
+ }
+
+ // 12. Let processedKeys be ArrayCreate(0).
+ // (This really should be a List, but we use an Array here in order that
+ // |intl_ComputeDisplayNames| may infallibly access the list's length via
+ // |ArrayObject::length|.)
+ let processedKeys = [];
+ // 13. Let len be ? ToLength(? Get(keys, "length")).
+ let len = ToLength(keys.length);
+ // 14. Let i be 0.
+ // 15. Repeat, while i < len
+ for (let i = 0; i < len; i++) {
+ // a. Let processedKey be ? ToString(? Get(keys, i)).
+ // b. Perform ? CreateDataPropertyOrThrow(processedKeys, i, processedKey).
+ callFunction(std_Array_push, processedKeys, ToString(keys[i]));
+ }
+
+ // 16. Let names be ? ComputeDisplayNames(r.[[locale]], style, processedKeys).
+ const names = intl_ComputeDisplayNames(r.locale, style, processedKeys);
+
+ // 17. Let values be ObjectCreate(%ObjectPrototype%).
+ const values = {};
+
+ // 18. Set i to 0.
+ // 19. Repeat, while i < len
+ for (let i = 0; i < len; i++) {
+ // a. Let key be ? Get(processedKeys, i).
+ const key = processedKeys[i];
+ // b. Let name be ? Get(names, i).
+ const name = names[i];
+ // c. Assert: Type(name) is string.
+ assert(typeof name === "string", "unexpected non-string value");
+ // d. Assert: the length of name is greater than zero.
+ assert(name.length > 0, "empty string value");
+ // e. Perform ? DefinePropertyOrThrow(values, key, name).
+ _DefineDataProperty(values, key, name);
+ }
+
+ // 20. Let options be ObjectCreate(%ObjectPrototype%).
+ // 21. Perform ! DefinePropertyOrThrow(result, "locale", r.[[locale]]).
+ // 22. Perform ! DefinePropertyOrThrow(result, "style", style).
+ // 23. Perform ! DefinePropertyOrThrow(result, "values", values).
+ const result = { locale: r.locale, style, values };
+
+ // 24. Return result.
+ return result;
+
+}
diff --git a/js/src/builtin/String.js b/js/src/builtin/String.js
index 4202d0de6..6d1d335a0 100644
--- a/js/src/builtin/String.js
+++ b/js/src/builtin/String.js
@@ -659,11 +659,7 @@ function String_static_localeCompare(str1, str2) {
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.localeCompare");
var locales = arguments.length > 2 ? arguments[2] : undefined;
var options = arguments.length > 3 ? arguments[3] : undefined;
-#if EXPOSE_INTL_API
return callFunction(String_localeCompare, str1, str2, locales, options);
-#else
- return callFunction(std_String_localeCompare, str1, str2, locales, options);
-#endif
}
// ES6 draft 2014-04-27 B.2.3.3
@@ -855,14 +851,12 @@ function String_static_toLocaleUpperCase(string) {
return callFunction(std_String_toLocaleUpperCase, string);
}
-#if EXPOSE_INTL_API
function String_static_normalize(string) {
if (arguments.length < 1)
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.normalize');
var form = arguments.length > 1 ? arguments[1] : undefined;
return callFunction(std_String_normalize, string, form);
}
-#endif
function String_static_concat(string, arg1) {
if (arguments.length < 1)
diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp
index a14f9ba69..00637a7a5 100644
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -236,11 +236,7 @@ GetBuildConfiguration(JSContext* cx, unsigned argc, Value* vp)
if (!JS_SetProperty(cx, info, "binary-data", value))
return false;
-#ifdef EXPOSE_INTL_API
value = BooleanValue(true);
-#else
- value = BooleanValue(false);
-#endif
if (!JS_SetProperty(cx, info, "intl-api", value))
return false;
diff --git a/js/src/builtin/TypedArray.js b/js/src/builtin/TypedArray.js
index a2205dc92..a1934051d 100644
--- a/js/src/builtin/TypedArray.js
+++ b/js/src/builtin/TypedArray.js
@@ -1232,11 +1232,7 @@ function TypedArrayToLocaleString(locales = undefined, options = undefined) {
// Steps 6-7.
// Omit the 'if' clause in step 6, since typed arrays can't have undefined
// or null elements.
-#if EXPOSE_INTL_API
var R = ToString(callContentFunction(firstElement.toLocaleString, firstElement, locales, options));
-#else
- var R = ToString(callContentFunction(firstElement.toLocaleString, firstElement));
-#endif
// Step 3 (reordered).
// We don't (yet?) implement locale-dependent separators.
@@ -1258,11 +1254,7 @@ function TypedArrayToLocaleString(locales = undefined, options = undefined) {
// the error message. So despite bug 1079853, we can skip step 9.c.
// Step 9.d.
-#if EXPOSE_INTL_API
R = ToString(callContentFunction(nextElement.toLocaleString, nextElement, locales, options));
-#else
- R = ToString(callContentFunction(nextElement.toLocaleString, nextElement));
-#endif
// Step 9.e.
R = S + R;