Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(565)

Unified Diff: src/runtime/runtime-i18n.cc

Issue 2491333003: Use a regular ICU API for el-Upper (Closed)
Patch Set: roll ICU to c1a237113 Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « DEPS ('k') | test/intl/general/case-mapping.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-i18n.cc
diff --git a/src/runtime/runtime-i18n.cc b/src/runtime/runtime-i18n.cc
index 14ebebb00bf518eaa13a5ccc8fddc33e245aa8f8..b8cdb5b113493c7b3e5293af3ad5b4874d186c67 100644
--- a/src/runtime/runtime-i18n.cc
+++ b/src/runtime/runtime-i18n.cc
@@ -939,55 +939,10 @@ RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) {
}
namespace {
-void ConvertCaseWithTransliterator(icu::UnicodeString* input,
- const char* transliterator_id) {
- UErrorCode status = U_ZERO_ERROR;
- std::unique_ptr<icu::Transliterator> translit(
- icu::Transliterator::createInstance(
- icu::UnicodeString(transliterator_id, -1, US_INV), UTRANS_FORWARD,
- status));
- if (U_FAILURE(status)) return;
- translit->transliterate(*input);
-}
-
MUST_USE_RESULT Object* LocaleConvertCase(Handle<String> s, Isolate* isolate,
bool is_to_upper, const char* lang) {
- int32_t src_length = s->length();
-
- // Greek uppercasing has to be done via transliteration.
- // TODO(jshin): Drop this special-casing once ICU's regular case conversion
- // API supports Greek uppercasing. See
- // http://bugs.icu-project.org/trac/ticket/10582 .
- // In the meantime, if there's no Greek character in |s|, call this
- // function again with the root locale (lang="").
- // ICU's C API for transliteration is nasty and we just use C++ API.
- if (V8_UNLIKELY(is_to_upper && lang[0] == 'e' && lang[1] == 'l')) {
- icu::UnicodeString converted;
- std::unique_ptr<uc16[]> sap;
- {
- DisallowHeapAllocation no_gc;
- String::FlatContent flat = s->GetFlatContent();
- const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length);
- // Starts with the source string (read-only alias with copy-on-write
- // semantics) and will be modified to contain the converted result.
- // Using read-only alias at first saves one copy operation if
- // transliteration does not change the input, which is rather rare.
- // Moreover, transliteration takes rather long so that saving one copy
- // helps only a little bit.
- converted.setTo(false, src, src_length);
- ConvertCaseWithTransliterator(&converted, "el-Upper");
- // If no change is made, just return |s|.
- if (converted.getBuffer() == src) return *s;
- }
- RETURN_RESULT_OR_FAILURE(
- isolate,
- isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(converted.getBuffer()),
- converted.length())));
- }
-
auto case_converter = is_to_upper ? u_strToUpper : u_strToLower;
-
+ int32_t src_length = s->length();
int32_t dest_length = src_length;
UErrorCode status;
Handle<SeqTwoByteString> result;
« no previous file with comments | « DEPS ('k') | test/intl/general/case-mapping.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698