• 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
icu-case-mapping.js 956 Bytes