mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-23 18:26:15 +00:00
Bug 1319464 - Replace flattened with linear strings in Intl.cpp file. r=Waldo
This commit is contained in:
parent
4bf964cab8
commit
b64b9b133b
@ -104,12 +104,6 @@ Char16ToUChar(char16_t* chars)
|
||||
MOZ_CRASH("Char16ToUChar: Intl API disabled");
|
||||
}
|
||||
|
||||
int32_t
|
||||
u_strlen(const UChar* s)
|
||||
{
|
||||
MOZ_CRASH("u_strlen: Intl API disabled");
|
||||
}
|
||||
|
||||
struct UEnumeration;
|
||||
|
||||
int32_t
|
||||
@ -1524,12 +1518,10 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
|
||||
currency = value.toString();
|
||||
MOZ_ASSERT(currency->length() == 3,
|
||||
"IsWellFormedCurrencyCode permits only length-3 strings");
|
||||
if (!currency->ensureFlat(cx) || !stableChars.initTwoByte(cx, currency))
|
||||
if (!stableChars.initTwoByte(cx, currency))
|
||||
return nullptr;
|
||||
// uCurrency remains owned by stableChars.
|
||||
uCurrency = Char16ToUChar(stableChars.twoByteRange().begin().get());
|
||||
if (!uCurrency)
|
||||
return nullptr;
|
||||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().currencyDisplay, &value))
|
||||
return nullptr;
|
||||
@ -1634,9 +1626,10 @@ intl_FormatNumber(JSContext* cx, UNumberFormat* nf, double x, MutableHandleValue
|
||||
if (!chars.resize(INITIAL_CHAR_BUFFER_SIZE))
|
||||
return false;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
int size = unum_formatDouble(nf, x, Char16ToUChar(chars.begin()), INITIAL_CHAR_BUFFER_SIZE,
|
||||
int32_t size = unum_formatDouble(nf, x, Char16ToUChar(chars.begin()), INITIAL_CHAR_BUFFER_SIZE,
|
||||
nullptr, &status);
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
MOZ_ASSERT(size >= 0);
|
||||
if (!chars.resize(size))
|
||||
return false;
|
||||
status = U_ZERO_ERROR;
|
||||
@ -1647,6 +1640,7 @@ intl_FormatNumber(JSContext* cx, UNumberFormat* nf, double x, MutableHandleValue
|
||||
return false;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(size >= 0);
|
||||
JSString* str = NewStringCopyN<CanGC>(cx, chars.begin(), size);
|
||||
if (!str)
|
||||
return false;
|
||||
@ -2048,7 +2042,7 @@ HashStringIgnoreCaseASCII(const Char* s, size_t length)
|
||||
return hash;
|
||||
}
|
||||
|
||||
js::SharedIntlData::TimeZoneHasher::Lookup::Lookup(JSFlatString* timeZone)
|
||||
js::SharedIntlData::TimeZoneHasher::Lookup::Lookup(JSLinearString* timeZone)
|
||||
: isLatin1(timeZone->hasLatin1Chars()), length(timeZone->length())
|
||||
{
|
||||
if (isLatin1) {
|
||||
@ -2214,11 +2208,11 @@ js::SharedIntlData::validateTimeZoneName(JSContext* cx, HandleString timeZone,
|
||||
if (!ensureTimeZones(cx))
|
||||
return false;
|
||||
|
||||
Rooted<JSFlatString*> timeZoneFlat(cx, timeZone->ensureFlat(cx));
|
||||
if (!timeZoneFlat)
|
||||
RootedLinearString timeZoneLinear(cx, timeZone->ensureLinear(cx));
|
||||
if (!timeZoneLinear)
|
||||
return false;
|
||||
|
||||
TimeZoneHasher::Lookup lookup(timeZoneFlat);
|
||||
TimeZoneHasher::Lookup lookup(timeZoneLinear);
|
||||
if (TimeZoneSet::Ptr p = availableTimeZones.lookup(lookup))
|
||||
result.set(*p);
|
||||
|
||||
@ -2232,11 +2226,11 @@ js::SharedIntlData::tryCanonicalizeTimeZoneConsistentWithIANA(JSContext* cx, Han
|
||||
if (!ensureTimeZones(cx))
|
||||
return false;
|
||||
|
||||
Rooted<JSFlatString*> timeZoneFlat(cx, timeZone->ensureFlat(cx));
|
||||
if (!timeZoneFlat)
|
||||
RootedLinearString timeZoneLinear(cx, timeZone->ensureLinear(cx));
|
||||
if (!timeZoneLinear)
|
||||
return false;
|
||||
|
||||
TimeZoneHasher::Lookup lookup(timeZoneFlat);
|
||||
TimeZoneHasher::Lookup lookup(timeZoneLinear);
|
||||
MOZ_ASSERT(availableTimeZones.has(lookup), "Invalid time zone name");
|
||||
|
||||
if (TimeZoneMap::Ptr p = ianaLinksCanonicalizedDifferentlyByICU.lookup(lookup)) {
|
||||
@ -2440,16 +2434,11 @@ js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
|
||||
if (!locale)
|
||||
return false;
|
||||
|
||||
JSFlatString* skeletonFlat = args[1].toString()->ensureFlat(cx);
|
||||
if (!skeletonFlat)
|
||||
AutoStableStringChars skeleton(cx);
|
||||
if (!skeleton.initTwoByte(cx, args[1].toString()))
|
||||
return false;
|
||||
|
||||
AutoStableStringChars stableChars(cx);
|
||||
if (!stableChars.initTwoByte(cx, skeletonFlat))
|
||||
return false;
|
||||
|
||||
mozilla::Range<const char16_t> skeletonChars = stableChars.twoByteRange();
|
||||
uint32_t skeletonLen = u_strlen(Char16ToUChar(skeletonChars.begin().get()));
|
||||
mozilla::Range<const char16_t> skeletonChars = skeleton.twoByteRange();
|
||||
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UDateTimePatternGenerator* gen = udatpg_open(icuLocale(locale.ptr()), &status);
|
||||
@ -2459,25 +2448,28 @@ js::intl_patternForSkeleton(JSContext* cx, unsigned argc, Value* vp)
|
||||
}
|
||||
ScopedICUObject<UDateTimePatternGenerator, udatpg_close> toClose(gen);
|
||||
|
||||
Vector<char16_t, INITIAL_CHAR_BUFFER_SIZE> chars(cx);
|
||||
if (!chars.resize(INITIAL_CHAR_BUFFER_SIZE))
|
||||
return false;
|
||||
|
||||
int32_t size = udatpg_getBestPattern(gen, Char16ToUChar(skeletonChars.begin().get()),
|
||||
skeletonLen, nullptr, 0, &status);
|
||||
if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
|
||||
skeletonChars.length(), Char16ToUChar(chars.begin()),
|
||||
INITIAL_CHAR_BUFFER_SIZE, &status);
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
MOZ_ASSERT(size >= 0);
|
||||
if (!chars.resize(size))
|
||||
return false;
|
||||
}
|
||||
ScopedJSFreePtr<UChar> pattern(cx->pod_malloc<UChar>(size + 1));
|
||||
if (!pattern)
|
||||
return false;
|
||||
pattern[size] = '\0';
|
||||
status = U_ZERO_ERROR;
|
||||
udatpg_getBestPattern(gen, Char16ToUChar(skeletonChars.begin().get()),
|
||||
skeletonLen, pattern, size, &status);
|
||||
skeletonChars.length(), Char16ToUChar(chars.begin()), size, &status);
|
||||
}
|
||||
if (U_FAILURE(status)) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedString str(cx, JS_NewUCStringCopyZ(cx, reinterpret_cast<char16_t*>(pattern.get())));
|
||||
MOZ_ASSERT(size >= 0);
|
||||
JSString* str = NewStringCopyN<CanGC>(cx, chars.begin(), size);
|
||||
if (!str)
|
||||
return false;
|
||||
args.rval().setString(str);
|
||||
@ -2510,29 +2502,26 @@ NewUDateFormat(JSContext* cx, HandleObject dateTimeFormat)
|
||||
if (!GetProperty(cx, internals, internals, cx->names().timeZone, &value))
|
||||
return nullptr;
|
||||
|
||||
AutoStableStringChars timeZoneChars(cx);
|
||||
Rooted<JSFlatString*> timeZoneFlat(cx, value.toString()->ensureFlat(cx));
|
||||
if (!timeZoneFlat || !timeZoneChars.initTwoByte(cx, timeZoneFlat))
|
||||
AutoStableStringChars timeZone(cx);
|
||||
if (!timeZone.initTwoByte(cx, value.toString()))
|
||||
return nullptr;
|
||||
|
||||
const UChar* uTimeZone = Char16ToUChar(timeZoneChars.twoByteRange().begin().get());
|
||||
uint32_t uTimeZoneLength = u_strlen(uTimeZone);
|
||||
mozilla::Range<const char16_t> timeZoneChars = timeZone.twoByteRange();
|
||||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().pattern, &value))
|
||||
return nullptr;
|
||||
|
||||
AutoStableStringChars patternChars(cx);
|
||||
Rooted<JSFlatString*> patternFlat(cx, value.toString()->ensureFlat(cx));
|
||||
if (!patternFlat || !patternChars.initTwoByte(cx, patternFlat))
|
||||
AutoStableStringChars pattern(cx);
|
||||
if (!pattern.initTwoByte(cx, value.toString()))
|
||||
return nullptr;
|
||||
|
||||
const UChar* uPattern = Char16ToUChar(patternChars.twoByteRange().begin().get());
|
||||
uint32_t uPatternLength = u_strlen(uPattern);
|
||||
mozilla::Range<const char16_t> patternChars = pattern.twoByteRange();
|
||||
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UDateFormat* df =
|
||||
udat_open(UDAT_PATTERN, UDAT_PATTERN, icuLocale(locale.ptr()), uTimeZone, uTimeZoneLength,
|
||||
uPattern, uPatternLength, &status);
|
||||
udat_open(UDAT_PATTERN, UDAT_PATTERN, icuLocale(locale.ptr()),
|
||||
Char16ToUChar(timeZoneChars.begin().get()), timeZoneChars.length(),
|
||||
Char16ToUChar(patternChars.begin().get()), patternChars.length(), &status);
|
||||
if (U_FAILURE(status)) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
|
||||
return nullptr;
|
||||
@ -2560,9 +2549,10 @@ intl_FormatDateTime(JSContext* cx, UDateFormat* df, double x, MutableHandleValue
|
||||
if (!chars.resize(INITIAL_CHAR_BUFFER_SIZE))
|
||||
return false;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
int size = udat_format(df, x, Char16ToUChar(chars.begin()), INITIAL_CHAR_BUFFER_SIZE,
|
||||
int32_t size = udat_format(df, x, Char16ToUChar(chars.begin()), INITIAL_CHAR_BUFFER_SIZE,
|
||||
nullptr, &status);
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
MOZ_ASSERT(size >= 0);
|
||||
if (!chars.resize(size))
|
||||
return false;
|
||||
status = U_ZERO_ERROR;
|
||||
@ -2573,6 +2563,7 @@ intl_FormatDateTime(JSContext* cx, UDateFormat* df, double x, MutableHandleValue
|
||||
return false;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(size >= 0);
|
||||
JSString* str = NewStringCopyN<CanGC>(cx, chars.begin(), size);
|
||||
if (!str)
|
||||
return false;
|
||||
@ -2690,10 +2681,11 @@ intl_FormatToPartsDateTime(JSContext* cx, UDateFormat* df, double x, MutableHand
|
||||
}
|
||||
auto closeFieldPosIter = MakeScopeExit([&]() { ufieldpositer_close(fpositer); });
|
||||
|
||||
int resultSize =
|
||||
int32_t resultSize =
|
||||
udat_formatForFields(df, x, Char16ToUChar(chars.begin()), INITIAL_CHAR_BUFFER_SIZE,
|
||||
fpositer, &status);
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR) {
|
||||
MOZ_ASSERT(resultSize >= 0);
|
||||
if (!chars.resize(resultSize))
|
||||
return false;
|
||||
status = U_ZERO_ERROR;
|
||||
@ -2707,6 +2699,8 @@ intl_FormatToPartsDateTime(JSContext* cx, UDateFormat* df, double x, MutableHand
|
||||
RootedArrayObject partsArray(cx, NewDenseEmptyArray(cx));
|
||||
if (!partsArray)
|
||||
return false;
|
||||
|
||||
MOZ_ASSERT(resultSize >= 0);
|
||||
if (resultSize == 0) {
|
||||
// An empty string contains no parts, so avoid extra work below.
|
||||
result.setObject(*partsArray);
|
||||
|
@ -20,6 +20,8 @@
|
||||
#include "unicode/utypes.h"
|
||||
#endif
|
||||
|
||||
class JSLinearString;
|
||||
|
||||
/*
|
||||
* The Intl module specified by standard ECMA-402,
|
||||
* ECMAScript Internationalization API Specification.
|
||||
@ -82,7 +84,7 @@ class SharedIntlData
|
||||
JS::AutoCheckCannotGC nogc;
|
||||
HashNumber hash;
|
||||
|
||||
explicit Lookup(JSFlatString* timeZone);
|
||||
explicit Lookup(JSLinearString* timeZone);
|
||||
};
|
||||
|
||||
static js::HashNumber hash(const Lookup& lookup) { return lookup.hash; }
|
||||
|
Loading…
Reference in New Issue
Block a user