diff options
author | Elliott Hughes <enh@google.com> | 2014-05-29 17:41:25 -0700 |
---|---|---|
committer | Narayan Kamath <narayan@google.com> | 2014-06-16 11:47:41 +0100 |
commit | a94266074c7b82720fd2cecfb37ab8da85f1b296 (patch) | |
tree | 3a0b903bb2bbaaeb4fb8360deeb35eccabee2e9e /luni/src/main/native | |
parent | f577d7594f3acc1d97e119c508e8e4edfeb1f20b (diff) | |
download | libcore-a94266074c7b82720fd2cecfb37ab8da85f1b296.zip libcore-a94266074c7b82720fd2cecfb37ab8da85f1b296.tar.gz libcore-a94266074c7b82720fd2cecfb37ab8da85f1b296.tar.bz2 |
Pass BCP-47 tags and not Locale.toString results to ICU.
ICU can't handle the new toString forms for scripts etc.
and it's also guaranteed to deal with BCP-47 tags correctly.
Most of the changes in this patch are required to keep
backwards compatibility for getDisplayCountry string etc. in
the face of the transformations toLanguageTag performs.
A few tests were changed, but for the better.
The tagalog -> filipino charlie foxtrot will be dealt with
in a follow up change.
Co-Authored-By: Narayan Kamath <narayan@google.com>
Change-Id: Ia7f26d92a0e38c4bbb1d839c0fbd8ad16a473bf5
Diffstat (limited to 'luni/src/main/native')
-rw-r--r-- | luni/src/main/native/IcuUtilities.cpp | 4 | ||||
-rw-r--r-- | luni/src/main/native/IcuUtilities.h | 2 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_AlphabeticIndex.cpp | 17 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_DateIntervalFormat.cpp | 8 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_ICU.cpp | 195 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_NativeBreakIterator.cpp | 18 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_NativeCollation.cpp | 5 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_TimeZoneNames.cpp | 19 |
8 files changed, 165 insertions, 103 deletions
diff --git a/luni/src/main/native/IcuUtilities.cpp b/luni/src/main/native/IcuUtilities.cpp index c6f3950..7ce2168 100644 --- a/luni/src/main/native/IcuUtilities.cpp +++ b/luni/src/main/native/IcuUtilities.cpp @@ -28,10 +28,6 @@ #include "unicode/uloc.h" #include "unicode/ustring.h" -Locale getLocale(JNIEnv* env, jstring localeName) { - return Locale::createFromName(ScopedUtfChars(env, localeName).c_str()); -} - jobjectArray fromStringEnumeration(JNIEnv* env, UErrorCode& status, const char* provider, StringEnumeration* se) { if (maybeThrowIcuException(env, provider, status)) { return NULL; diff --git a/luni/src/main/native/IcuUtilities.h b/luni/src/main/native/IcuUtilities.h index ffcfcda..737379e 100644 --- a/luni/src/main/native/IcuUtilities.h +++ b/luni/src/main/native/IcuUtilities.h @@ -23,9 +23,7 @@ #include "jni.h" #include "ustrenum.h" // For UStringEnumeration. #include "unicode/utypes.h" // For UErrorCode. -#include "unicode/locid.h" // For Locale. -extern Locale getLocale(JNIEnv* env, jstring localeName); extern jobjectArray fromStringEnumeration(JNIEnv* env, UErrorCode& status, const char* provider, StringEnumeration*); bool maybeThrowIcuException(JNIEnv* env, const char* function, UErrorCode error); diff --git a/luni/src/main/native/libcore_icu_AlphabeticIndex.cpp b/luni/src/main/native/libcore_icu_AlphabeticIndex.cpp index bb05193..e0638bd 100644 --- a/luni/src/main/native/libcore_icu_AlphabeticIndex.cpp +++ b/luni/src/main/native/libcore_icu_AlphabeticIndex.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "JniConstants.h" #include "JniException.h" +#include "ScopedIcuLocale.h" #include "ScopedJavaUnicodeString.h" #include "unicode/alphaindex.h" #include "unicode/uniset.h" @@ -28,9 +29,13 @@ static AlphabeticIndex* fromPeer(jlong peer) { return reinterpret_cast<AlphabeticIndex*>(static_cast<uintptr_t>(peer)); } -static jlong AlphabeticIndex_create(JNIEnv* env, jclass, jstring javaLocale) { +static jlong AlphabeticIndex_create(JNIEnv* env, jclass, jstring javaLocaleName) { UErrorCode status = U_ZERO_ERROR; - AlphabeticIndex* ai = new AlphabeticIndex(getLocale(env, javaLocale), status); + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return 0; + } + AlphabeticIndex* ai = new AlphabeticIndex(icuLocale.locale(), status); if (maybeThrowIcuException(env, "AlphabeticIndex", status)) { return 0; } @@ -53,10 +58,14 @@ static void AlphabeticIndex_setMaxLabelCount(JNIEnv* env, jclass, jlong peer, ji maybeThrowIcuException(env, "AlphabeticIndex::setMaxLabelCount", status); } -static void AlphabeticIndex_addLabels(JNIEnv* env, jclass, jlong peer, jstring javaLocale) { +static void AlphabeticIndex_addLabels(JNIEnv* env, jclass, jlong peer, jstring javaLocaleName) { AlphabeticIndex* ai = fromPeer(peer); + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return; + } UErrorCode status = U_ZERO_ERROR; - ai->addLabels(getLocale(env, javaLocale), status); + ai->addLabels(icuLocale.locale(), status); maybeThrowIcuException(env, "AlphabeticIndex::addLabels", status); } diff --git a/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp b/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp index 72bc631..a3258c1 100644 --- a/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp +++ b/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp @@ -18,13 +18,17 @@ #include "IcuUtilities.h" #include "JniConstants.h" +#include "ScopedIcuLocale.h" #include "ScopedJavaUnicodeString.h" #include "UniquePtr.h" #include "cutils/log.h" #include "unicode/dtitvfmt.h" static jlong DateIntervalFormat_createDateIntervalFormat(JNIEnv* env, jclass, jstring javaSkeleton, jstring javaLocaleName, jstring javaTzName) { - Locale locale = getLocale(env, javaLocaleName); + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return 0; + } ScopedJavaUnicodeString skeletonHolder(env, javaSkeleton); if (!skeletonHolder.valid()) { @@ -32,7 +36,7 @@ static jlong DateIntervalFormat_createDateIntervalFormat(JNIEnv* env, jclass, js } UErrorCode status = U_ZERO_ERROR; - DateIntervalFormat* formatter(DateIntervalFormat::createInstance(skeletonHolder.unicodeString(), locale, status)); + DateIntervalFormat* formatter(DateIntervalFormat::createInstance(skeletonHolder.unicodeString(), icuLocale.locale(), status)); if (maybeThrowIcuException(env, "DateIntervalFormat::createInstance", status)) { return 0; } diff --git a/luni/src/main/native/libcore_icu_ICU.cpp b/luni/src/main/native/libcore_icu_ICU.cpp index 7b1aac1..8cf58bc 100644 --- a/luni/src/main/native/libcore_icu_ICU.cpp +++ b/luni/src/main/native/libcore_icu_ICU.cpp @@ -21,6 +21,7 @@ #include "JniConstants.h" #include "JniException.h" #include "ScopedFd.h" +#include "ScopedIcuLocale.h" #include "ScopedJavaUnicodeString.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" @@ -96,30 +97,30 @@ class ScopedResourceBundle { DISALLOW_COPY_AND_ASSIGN(ScopedResourceBundle); }; -static jstring ICU_addLikelySubtags(JNIEnv* env, jclass, jstring javaLocale) { +static jstring ICU_addLikelySubtags(JNIEnv* env, jclass, jstring javaLocaleName) { UErrorCode status = U_ZERO_ERROR; - ScopedUtfChars localeID(env, javaLocale); + ScopedUtfChars localeID(env, javaLocaleName); char maximizedLocaleID[ULOC_FULLNAME_CAPACITY]; uloc_addLikelySubtags(localeID.c_str(), maximizedLocaleID, sizeof(maximizedLocaleID), &status); if (U_FAILURE(status)) { - return javaLocale; + return javaLocaleName; } return env->NewStringUTF(maximizedLocaleID); } -static jstring ICU_getScript(JNIEnv* env, jclass, jstring javaLocale) { - UErrorCode status = U_ZERO_ERROR; - ScopedUtfChars localeID(env, javaLocale); - char script[ULOC_SCRIPT_CAPACITY]; - uloc_getScript(localeID.c_str(), script, sizeof(script), &status); - if (U_FAILURE(status)) { - return NULL; - } - return env->NewStringUTF(script); +static jstring ICU_getScript(JNIEnv* env, jclass, jstring javaLocaleName) { + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return NULL; + } + return env->NewStringUTF(icuLocale.locale().getScript()); } static jstring ICU_localeForLanguageTag(JNIEnv* env, jclass, jstring languageTag, jboolean strict) { ScopedUtfChars languageTagChars(env, languageTag); + if (languageTagChars.c_str() == NULL) { + return NULL; + } // Naively assume that in the average case, the size of // the normalized language tag will be very nearly the same as the @@ -158,8 +159,7 @@ static jstring ICU_localeForLanguageTag(JNIEnv* env, jclass, jstring languageTag // NOTE: The cast is safe because parsedLength can never be negative thanks // to the check above. ICU does not document any negative return values for // that field, but check for it anyway. - if ((strict == JNI_TRUE) && - (static_cast<uint32_t>(parsedLength) != languageTagChars.size())) { + if ((strict == JNI_TRUE) && (static_cast<uint32_t>(parsedLength) != languageTagChars.size())) { return NULL; } @@ -228,9 +228,9 @@ static jstring ICU_getCurrencyCode(JNIEnv* env, jclass, jstring javaCountryCode) return (charCount == 0) ? env->NewStringUTF("XXX") : env->NewString(chars, charCount); } -static jstring getCurrencyName(JNIEnv* env, jstring javaLocaleName, jstring javaCurrencyCode, UCurrNameStyle nameStyle) { - ScopedUtfChars localeName(env, javaLocaleName); - if (localeName.c_str() == NULL) { +static jstring getCurrencyName(JNIEnv* env, jstring javaLanguageTag, jstring javaCurrencyCode, UCurrNameStyle nameStyle) { + ScopedUtfChars languageTag(env, javaLanguageTag); + if (languageTag.c_str() == NULL) { return NULL; } ScopedJavaUnicodeString currencyCode(env, javaCurrencyCode); @@ -241,7 +241,7 @@ static jstring getCurrencyName(JNIEnv* env, jstring javaLocaleName, jstring java UErrorCode status = U_ZERO_ERROR; UBool isChoiceFormat = false; int32_t charCount; - const UChar* chars = ucurr_getName(icuCurrencyCode.getTerminatedBuffer(), localeName.c_str(), + const UChar* chars = ucurr_getName(icuCurrencyCode.getTerminatedBuffer(), languageTag.c_str(), nameStyle, &isChoiceFormat, &charCount, &status); if (status == U_USING_DEFAULT_WARNING) { if (nameStyle == UCURR_SYMBOL_NAME) { @@ -260,54 +260,88 @@ static jstring getCurrencyName(JNIEnv* env, jstring javaLocaleName, jstring java return (charCount == 0) ? NULL : env->NewString(chars, charCount); } -static jstring ICU_getCurrencyDisplayName(JNIEnv* env, jclass, jstring javaLocaleName, jstring javaCurrencyCode) { - return getCurrencyName(env, javaLocaleName, javaCurrencyCode, UCURR_LONG_NAME); +static jstring ICU_getCurrencyDisplayName(JNIEnv* env, jclass, jstring javaLanguageTag, jstring javaCurrencyCode) { + return getCurrencyName(env, javaLanguageTag, javaCurrencyCode, UCURR_LONG_NAME); } -static jstring ICU_getCurrencySymbol(JNIEnv* env, jclass, jstring javaLocaleName, jstring javaCurrencyCode) { - return getCurrencyName(env, javaLocaleName, javaCurrencyCode, UCURR_SYMBOL_NAME); +static jstring ICU_getCurrencySymbol(JNIEnv* env, jclass, jstring javaLanguageTag, jstring javaCurrencyCode) { + return getCurrencyName(env, javaLanguageTag, javaCurrencyCode, UCURR_SYMBOL_NAME); } -static jstring ICU_getDisplayCountryNative(JNIEnv* env, jclass, jstring targetLocale, jstring locale) { - Locale loc = getLocale(env, locale); - Locale targetLoc = getLocale(env, targetLocale); - UnicodeString str; - targetLoc.getDisplayCountry(loc, str); - return env->NewString(str.getBuffer(), str.length()); +static jstring ICU_getDisplayCountryNative(JNIEnv* env, jclass, jstring javaTargetLanguageTag, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + ScopedIcuLocale icuTargetLocale(env, javaTargetLanguageTag); + if (!icuTargetLocale.valid()) { + return NULL; + } + + UnicodeString str; + icuTargetLocale.locale().getDisplayCountry(icuLocale.locale(), str); + return env->NewString(str.getBuffer(), str.length()); } -static jstring ICU_getDisplayLanguageNative(JNIEnv* env, jclass, jstring targetLocale, jstring locale) { - Locale loc = getLocale(env, locale); - Locale targetLoc = getLocale(env, targetLocale); - UnicodeString str; - targetLoc.getDisplayLanguage(loc, str); - return env->NewString(str.getBuffer(), str.length()); +static jstring ICU_getDisplayLanguageNative(JNIEnv* env, jclass, jstring javaTargetLanguageTag, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + ScopedIcuLocale icuTargetLocale(env, javaTargetLanguageTag); + if (!icuTargetLocale.valid()) { + return NULL; + } + + UnicodeString str; + icuTargetLocale.locale().getDisplayLanguage(icuLocale.locale(), str); + return env->NewString(str.getBuffer(), str.length()); } -static jstring ICU_getDisplayScriptNative(JNIEnv* env, jclass, jstring targetLocale, jstring locale) { - Locale loc = getLocale(env, locale); - Locale targetLoc = getLocale(env, targetLocale); - UnicodeString str; - targetLoc.getDisplayScript(loc, str); - return env->NewString(str.getBuffer(), str.length()); +static jstring ICU_getDisplayScriptNative(JNIEnv* env, jclass, jstring javaTargetLanguageTag, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + ScopedIcuLocale icuTargetLocale(env, javaTargetLanguageTag); + if (!icuTargetLocale.valid()) { + return NULL; + } + + UnicodeString str; + icuTargetLocale.locale().getDisplayScript(icuLocale.locale(), str); + return env->NewString(str.getBuffer(), str.length()); } -static jstring ICU_getDisplayVariantNative(JNIEnv* env, jclass, jstring targetLocale, jstring locale) { - Locale loc = getLocale(env, locale); - Locale targetLoc = getLocale(env, targetLocale); - UnicodeString str; - targetLoc.getDisplayVariant(loc, str); - return env->NewString(str.getBuffer(), str.length()); +static jstring ICU_getDisplayVariantNative(JNIEnv* env, jclass, jstring javaTargetLanguageTag, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + ScopedIcuLocale icuTargetLocale(env, javaTargetLanguageTag); + if (!icuTargetLocale.valid()) { + return NULL; + } + + UnicodeString str; + icuTargetLocale.locale().getDisplayVariant(icuLocale.locale(), str); + return env->NewString(str.getBuffer(), str.length()); } -static jstring ICU_getISO3CountryNative(JNIEnv* env, jclass, jstring locale) { - Locale loc = getLocale(env, locale); - return env->NewStringUTF(loc.getISO3Country()); +static jstring ICU_getISO3CountryNative(JNIEnv* env, jclass, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + return env->NewStringUTF(icuLocale.locale().getISO3Country()); } -static jstring ICU_getISO3LanguageNative(JNIEnv* env, jclass, jstring locale) { - Locale loc = getLocale(env, locale); - return env->NewStringUTF(loc.getISO3Language()); +static jstring ICU_getISO3LanguageNative(JNIEnv* env, jclass, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + return env->NewStringUTF(icuLocale.locale().getISO3Language()); } static jobjectArray ICU_getISOCountriesNative(JNIEnv* env, jclass) { @@ -538,7 +572,10 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale return JNI_FALSE; // ICU has a fixed-length limit. } - Locale locale = getLocale(env, javaLocaleName); + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return JNI_FALSE; + } // Get the DateTimePatterns. UErrorCode status = U_ZERO_ERROR; @@ -557,7 +594,7 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale // Get the "Yesterday", "Today", and "Tomorrow" strings. bool foundYesterdayTodayAndTomorrow = false; for (LocaleNameIterator it(localeName.c_str(), status); it.HasNext(); it.Up()) { - if (getYesterdayTodayAndTomorrow(env, localeData, locale, it.Get())) { + if (getYesterdayTodayAndTomorrow(env, localeData, icuLocale.locale(), it.Get())) { foundYesterdayTodayAndTomorrow = true; break; } @@ -568,7 +605,7 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale } status = U_ZERO_ERROR; - UniquePtr<Calendar> cal(Calendar::createInstance(locale, status)); + UniquePtr<Calendar> cal(Calendar::createInstance(icuLocale.locale(), status)); if (U_FAILURE(status)) { return JNI_FALSE; } @@ -578,7 +615,7 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale // Get DateFormatSymbols. status = U_ZERO_ERROR; - DateFormatSymbols dateFormatSym(locale, status); + DateFormatSymbols dateFormatSym(icuLocale.locale(), status); if (U_FAILURE(status)) { return JNI_FALSE; } @@ -631,8 +668,8 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale status = U_ZERO_ERROR; // For numberPatterns and symbols. - setNumberPatterns(env, localeData, locale); - setDecimalFormatSymbolsData(env, localeData, locale); + setNumberPatterns(env, localeData, icuLocale.locale()); + setDecimalFormatSymbolsData(env, localeData, icuLocale.locale()); jstring countryCode = env->NewStringUTF(Locale::createFromName(localeName.c_str()).getCountry()); jstring internationalCurrencySymbol = ICU_getCurrencyCode(env, NULL, countryCode); @@ -655,25 +692,33 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLocale return JNI_TRUE; } -static jstring ICU_toLowerCase(JNIEnv* env, jclass, jstring javaString, jstring localeName) { +static jstring ICU_toLowerCase(JNIEnv* env, jclass, jstring javaString, jstring javaLanguageTag) { ScopedJavaUnicodeString scopedString(env, javaString); if (!scopedString.valid()) { return NULL; } + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } UnicodeString& s(scopedString.unicodeString()); UnicodeString original(s); - s.toLower(getLocale(env, localeName)); + s.toLower(icuLocale.locale()); return s == original ? javaString : env->NewString(s.getBuffer(), s.length()); } -static jstring ICU_toUpperCase(JNIEnv* env, jclass, jstring javaString, jstring localeName) { +static jstring ICU_toUpperCase(JNIEnv* env, jclass, jstring javaString, jstring javaLanguageTag) { ScopedJavaUnicodeString scopedString(env, javaString); if (!scopedString.valid()) { return NULL; } + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } UnicodeString& s(scopedString.unicodeString()); UnicodeString original(s); - s.toUpper(getLocale(env, localeName)); + s.toUpper(icuLocale.locale()); return s == original ? javaString : env->NewString(s.getBuffer(), s.length()); } @@ -708,10 +753,14 @@ static jobject ICU_getAvailableCurrencyCodes(JNIEnv* env, jclass) { return fromStringEnumeration(env, status, "ucurr_openISOCurrencies", &e); } -static jstring ICU_getBestDateTimePatternNative(JNIEnv* env, jclass, jstring javaSkeleton, jstring javaLocaleName) { - Locale locale = getLocale(env, javaLocaleName); +static jstring ICU_getBestDateTimePatternNative(JNIEnv* env, jclass, jstring javaSkeleton, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return NULL; + } + UErrorCode status = U_ZERO_ERROR; - UniquePtr<DateTimePatternGenerator> generator(DateTimePatternGenerator::createInstance(locale, status)); + UniquePtr<DateTimePatternGenerator> generator(DateTimePatternGenerator::createInstance(icuLocale.locale(), status)); if (maybeThrowIcuException(env, "DateTimePatternGenerator::createInstance", status)) { return NULL; } @@ -728,16 +777,14 @@ static jstring ICU_getBestDateTimePatternNative(JNIEnv* env, jclass, jstring jav return env->NewString(result.getBuffer(), result.length()); } -static void ICU_setDefaultLocale(JNIEnv* env, jclass, jstring javaLocaleName) { - Locale locale = getLocale(env, javaLocaleName); - UErrorCode status = U_ZERO_ERROR; +static void ICU_setDefaultLocale(JNIEnv* env, jclass, jstring javaLanguageTag) { + ScopedIcuLocale icuLocale(env, javaLanguageTag); + if (!icuLocale.valid()) { + return; + } - // TODO: Should we check whether locale.isBogus() here ? ICU will - // accept bogus locales as the default without complaint. It - // shouldn't make a difference in practice, users that set a bogus - // locale as the default shouldn't have any realistic expectation that - // things like defaults etc. will work correctly. - Locale::setDefault(locale, status); + UErrorCode status = U_ZERO_ERROR; + Locale::setDefault(icuLocale.locale(), status); maybeThrowIcuException(env, "Locale::setDefault", status); } diff --git a/luni/src/main/native/libcore_icu_NativeBreakIterator.cpp b/luni/src/main/native/libcore_icu_NativeBreakIterator.cpp index 0c8c3c9..ef0c2a9 100644 --- a/luni/src/main/native/libcore_icu_NativeBreakIterator.cpp +++ b/luni/src/main/native/libcore_icu_NativeBreakIterator.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "JniConstants.h" #include "JniException.h" +#include "ScopedIcuLocale.h" #include "ScopedUtfChars.h" #include "unicode/brkiter.h" #include "unicode/putil.h" @@ -107,13 +108,12 @@ class BreakIteratorAccessor { }; #define MAKE_BREAK_ITERATOR_INSTANCE(F) \ - UErrorCode status = U_ZERO_ERROR; \ - const ScopedUtfChars localeChars(env, javaLocale); \ - if (localeChars.c_str() == NULL) { \ + ScopedIcuLocale icuLocale(env, javaLocaleName); \ + if (!icuLocale.valid()) { \ return 0; \ } \ - Locale locale(Locale::createFromName(localeChars.c_str())); \ - BreakIterator* it = F(locale, status); \ + UErrorCode status = U_ZERO_ERROR; \ + BreakIterator* it = F(icuLocale.locale(), status); \ if (maybeThrowIcuException(env, "ubrk_open", status)) { \ return 0; \ } \ @@ -143,19 +143,19 @@ static jint NativeBreakIterator_followingImpl(JNIEnv* env, jclass, jlong address return it->following(offset); } -static jlong NativeBreakIterator_getCharacterInstanceImpl(JNIEnv* env, jclass, jstring javaLocale) { +static jlong NativeBreakIterator_getCharacterInstanceImpl(JNIEnv* env, jclass, jstring javaLocaleName) { MAKE_BREAK_ITERATOR_INSTANCE(BreakIterator::createCharacterInstance); } -static jlong NativeBreakIterator_getLineInstanceImpl(JNIEnv* env, jclass, jstring javaLocale) { +static jlong NativeBreakIterator_getLineInstanceImpl(JNIEnv* env, jclass, jstring javaLocaleName) { MAKE_BREAK_ITERATOR_INSTANCE(BreakIterator::createLineInstance); } -static jlong NativeBreakIterator_getSentenceInstanceImpl(JNIEnv* env, jclass, jstring javaLocale) { +static jlong NativeBreakIterator_getSentenceInstanceImpl(JNIEnv* env, jclass, jstring javaLocaleName) { MAKE_BREAK_ITERATOR_INSTANCE(BreakIterator::createSentenceInstance); } -static jlong NativeBreakIterator_getWordInstanceImpl(JNIEnv* env, jclass, jstring javaLocale) { +static jlong NativeBreakIterator_getWordInstanceImpl(JNIEnv* env, jclass, jstring javaLocaleName) { MAKE_BREAK_ITERATOR_INSTANCE(BreakIterator::createWordInstance); } diff --git a/luni/src/main/native/libcore_icu_NativeCollation.cpp b/luni/src/main/native/libcore_icu_NativeCollation.cpp index 00ec9ae..4ce42ec 100644 --- a/luni/src/main/native/libcore_icu_NativeCollation.cpp +++ b/luni/src/main/native/libcore_icu_NativeCollation.cpp @@ -180,11 +180,12 @@ static jint NativeCollation_next(JNIEnv* env, jclass, jlong address) { return result; } -static jlong NativeCollation_openCollator(JNIEnv* env, jclass, jstring localeName) { - ScopedUtfChars localeChars(env, localeName); +static jlong NativeCollation_openCollator(JNIEnv* env, jclass, jstring javaLocaleName) { + ScopedUtfChars localeChars(env, javaLocaleName); if (localeChars.c_str() == NULL) { return 0; } + UErrorCode status = U_ZERO_ERROR; UCollator* c = ucol_open(localeChars.c_str(), &status); maybeThrowIcuException(env, "ucol_open", status); diff --git a/luni/src/main/native/libcore_icu_TimeZoneNames.cpp b/luni/src/main/native/libcore_icu_TimeZoneNames.cpp index ef1743e..faf87f1 100644 --- a/luni/src/main/native/libcore_icu_TimeZoneNames.cpp +++ b/luni/src/main/native/libcore_icu_TimeZoneNames.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "JniConstants.h" #include "JniException.h" +#include "ScopedIcuLocale.h" #include "ScopedJavaUnicodeString.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" @@ -59,11 +60,14 @@ static bool setStringArrayElement(JNIEnv* env, jobjectArray array, int i, const return true; } -static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring localeName, jobjectArray result) { - Locale locale = getLocale(env, localeName); +static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring javaLocaleName, jobjectArray result) { + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return; + } UErrorCode status = U_ZERO_ERROR; - UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(locale, status)); + UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(icuLocale.locale(), status)); if (maybeThrowIcuException(env, "TimeZoneNames::createInstance", status)) { return; } @@ -118,11 +122,14 @@ static void TimeZoneNames_fillZoneStrings(JNIEnv* env, jclass, jstring localeNam } } -static jstring TimeZoneNames_getExemplarLocation(JNIEnv* env, jclass, jstring javaLocale, jstring javaTz) { - Locale locale = getLocale(env, javaLocale); +static jstring TimeZoneNames_getExemplarLocation(JNIEnv* env, jclass, jstring javaLocaleName, jstring javaTz) { + ScopedIcuLocale icuLocale(env, javaLocaleName); + if (!icuLocale.valid()) { + return NULL; + } UErrorCode status = U_ZERO_ERROR; - UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(locale, status)); + UniquePtr<TimeZoneNames> names(TimeZoneNames::createInstance(icuLocale.locale(), status)); if (maybeThrowIcuException(env, "TimeZoneNames::createInstance", status)) { return NULL; } |