Bug 1319464 - Replace flattened with linear strings in Intl.cpp file. r=Waldo

This commit is contained in:
André Bargull 2016-11-23 09:12:51 -08:00
parent 4bf964cab8
commit b64b9b133b
2 changed files with 50 additions and 54 deletions

View File

@ -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);

View File

@ -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; }