• jshin's avatar
    Use ICU case conversion/transliterator for case conversion · b348d47b
    jshin authored
    When I18N is enabled, use ICU's case conversion API and transliteration
    API [1] to implement String.prototype.to{Upper,Lower}Case and
    String.prototype.toLocale{Upper,Lower}Case.
    
    * ICU-based case conversion was implemented in runtime-i18n.cc/i18n.js
    * The above 4 functions are overridden with those in i18n.js when
      --icu_case_mapping flag is turned on. To control the override by the flag,
      they're overriden in icu-case-mapping.js
    
    Previously, toLocale{U,L}Case just called to{U,L}Case so that they didn't
    support locale-sensitive case conversion for Turkic languages (az, tr),
    Greek (el) and Lithuanian (lt).
    
    Before ICU APIs for the most general case are called, a fast-path for Latin-1
    is tried. It's taken from Blink and adopted as necessary. This fast path
    is always tried for to{U,L}Case. For toLocale{U,L}Case, it's only taken
    when a locale (explicitly specified or default) is not in {az, el, lt, tr}.
    
    With these changes, a build with --icu_case_mapping=true passes a bunch
    of tests in test262/intl402/Strings/* and intl/* that failed before.
    
    Handling of pure ASCII strings (aligned at word boundary) are not as fast
    as Unibrow's implementation that uses word-by-word case conversion. OTOH,
    Latin-1 input handling is faster than Unibrow. General Unicode input
    handling is slower but more accurate.
    
    See https://docs.google.com/spreadsheets/d/1KJCJxKc1FxFXjwmYqABS0_2cNdPetvnd8gY8_HGSbrg/edit?usp=sharing for the benchmark.
    
    This CL started with http://crrev.com/1544023002#ps200001 by littledan@,
    but has changed significantly since.
    
    [1] See why transliteration API is needed for uppercasing in Greek.
        http://bugs.icu-project.org/trac/ticket/10582
    
    R=yangguo
    BUG=v8:4476,v8:4477
    LOG=Y
    TEST=test262/{built-ins,intl402}/Strings/*, webkit/fast/js/*, mjsunit/string-case,
         intl/general/case*
    
    Review-Url: https://codereview.chromium.org/1812673005
    Cr-Commit-Position: refs/heads/master@{#36187}
    b348d47b
Name
Last commit
Last update
..
break-iterator Loading commit data...
collator Loading commit data...
date-format Loading commit data...
general Loading commit data...
number-format Loading commit data...
overrides Loading commit data...
string Loading commit data...
OWNERS Loading commit data...
assert.js Loading commit data...
intl.gyp Loading commit data...
intl.isolate Loading commit data...
intl.status Loading commit data...
regexp-assert.js Loading commit data...
regexp-prepare.js Loading commit data...
testcfg.py Loading commit data...
utils.js Loading commit data...