• 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
benchmarks Loading commit data...
build_overrides Loading commit data...
docs Loading commit data...
gypfiles Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party/binutils Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
Makefile Loading commit data...
Makefile.android Loading commit data...
Makefile.nacl Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...