From 32882e526ae0e758dad995511d215654c4911be7 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 29 Dec 2016 16:57:33 -0800 Subject: [PATCH 1/2] deps: cherry-pick 2f5da9a from V8 upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message: Fix the uppercasing of U+00E7(ç) and U+00F7(÷) Due to a typo in runtime-i18n.js, 'ç'(U+00E7) was not uppercased while '÷'(U+00F7) was incorrectly uppercased to '×'(U+00D7). Add a comprehensive test for Latin-1 supplemental block (U+00A0 ~ U+00FF). (they're special-cased for speed-up and needs to have a test for the range.). TEST=intl/general/case-mapping BUG=v8:5681 Review-Url: https://codereview.chromium.org/2533033003 Cr-Commit-Position: refs/heads/master@{#41331} PR-URL: https://github.com/nodejs/node/pull/9828 Fixes: https://github.com/nodejs/node/issues/9785 --- deps/v8/include/v8-version.h | 2 +- deps/v8/src/runtime/runtime-i18n.cc | 2 +- deps/v8/test/intl/general/case-mapping.js | 26 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index 009a3b10425ee4..a39676e3779c60 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 5 #define V8_MINOR_VERSION 4 #define V8_BUILD_NUMBER 500 -#define V8_PATCH_LEVEL 45 +#define V8_PATCH_LEVEL 46 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8/src/runtime/runtime-i18n.cc b/deps/v8/src/runtime/runtime-i18n.cc index 8b9d92ec006eb5..c5577dadaf651f 100644 --- a/deps/v8/src/runtime/runtime-i18n.cc +++ b/deps/v8/src/runtime/runtime-i18n.cc @@ -931,7 +931,7 @@ inline uint16_t ToASCIIUpper(uint16_t ch) { inline uint16_t ToLatin1Upper(uint16_t ch) { DCHECK(ch != 0xDF && ch != 0xB5 && ch != 0xFF); return ch & - ~(((ch >= 'a' && ch <= 'z') || (((ch & 0xE0) == 0xE0) && ch != 0xE7)) + ~(((ch >= 'a' && ch <= 'z') || (((ch & 0xE0) == 0xE0) && ch != 0xF7)) << 5); } diff --git a/deps/v8/test/intl/general/case-mapping.js b/deps/v8/test/intl/general/case-mapping.js index a73622bf0deb9c..17eb5bae57bf02 100644 --- a/deps/v8/test/intl/general/case-mapping.js +++ b/deps/v8/test/intl/general/case-mapping.js @@ -136,3 +136,29 @@ assertEquals("\u{10CC0}", "\u{10C80}".toLocaleLowerCase()); assertEquals("\u{10C80}", "\u{10CC0}".toLocaleUpperCase(["tr"])); assertEquals("\u{10C80}", "\u{10CC0}".toLocaleUpperCase(["tr"])); assertEquals("\u{10CC0}", "\u{10C80}".toLocaleLowerCase()); + +// check fast path for Latin-1 supplement (U+00A0 ~ U+00FF) +var latin1Suppl = "\u00A0¡¢£¤¥¦§¨©ª«¬\u00AD®°±²³´µ¶·¸¹º»¼½¾¿" + + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; +var latin1SupplLowercased = "\u00A0¡¢£¤¥¦§¨©ª«¬\u00AD®°±²³´µ¶·¸¹º»¼½¾¿" + + "àáâãäåæçèéêëìíîïðñòóôõö×øùúûüýþßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"; +var latin1SupplUppercased = "\u00A0¡¢£¤¥¦§¨©ª«¬\u00AD®°±²³´\u039C¶·¸¹º»¼½¾¿" + + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞSSÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ÷ØÙÚÛÜÝÞ\u0178"; + +assertEquals(latin1SupplLowercased, latin1Suppl.toLowerCase()); +assertEquals(latin1SupplUppercased, latin1Suppl.toUpperCase()); +assertEquals(latin1SupplLowercased, latin1Suppl.toLocaleLowerCase("de")); +assertEquals(latin1SupplUppercased, latin1Suppl.toLocaleUpperCase("de")); +assertEquals(latin1SupplLowercased, latin1Suppl.toLocaleLowerCase("el")); +assertEquals(latin1SupplUppercased, latin1Suppl.toLocaleUpperCase("el")); +assertEquals(latin1SupplUppercased, latin1Suppl.toLocaleUpperCase("tr")); +assertEquals(latin1SupplLowercased, latin1Suppl.toLocaleLowerCase("tr")); +assertEquals(latin1SupplUppercased, latin1Suppl.toLocaleUpperCase("az")); +assertEquals(latin1SupplLowercased, latin1Suppl.toLocaleLowerCase("az")); +assertEquals(latin1SupplUppercased, latin1Suppl.toLocaleUpperCase("lt")); +// Lithuanian need to have a dot-above for U+00CC(Ì) and U+00CD(Í) when +// lowercasing. +assertEquals("\u00A0¡¢£¤¥¦§¨©ª«¬\u00AD®°±²³´µ¶·¸¹º»¼½¾¿" + + "àáâãäåæçèéêëi\u0307\u0300i\u0307\u0301îïðñòóôõö×øùúûüýþß" + + "àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ", + latin1Suppl.toLocaleLowerCase("lt")); From f9687b443d63e2b6e2fd2c915106c8fc44310cfa Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 28 Nov 2016 11:15:21 -0800 Subject: [PATCH 2/2] =?UTF-8?q?deps:=20add=20test=20for=20v8=20bug=20in=20?= =?UTF-8?q?toUpper('=C3=A7')?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add test for ç/Ç in various locales Reviewed-by: TBD PR-URL: https://github.com/nodejs/node/pull/9828 Fixes: https://github.com/nodejs/node/issues/9785 --- test/parallel/test-intl.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/parallel/test-intl.js b/test/parallel/test-intl.js index 1058650830d084..43707e08c03710 100644 --- a/test/parallel/test-intl.js +++ b/test/parallel/test-intl.js @@ -16,6 +16,16 @@ function haveLocale(loc) { return locs.indexOf(loc) !== -1; } +// Always run these. They should always pass, even if the locale +// param is ignored. +assert.strictEqual('Ç'.toLocaleLowerCase('el'), 'ç'); +assert.strictEqual('Ç'.toLocaleLowerCase('tr'), 'ç'); +assert.strictEqual('Ç'.toLowerCase(), 'ç'); + +assert.strictEqual('ç'.toLocaleUpperCase('el'), 'Ç'); +assert.strictEqual('ç'.toLocaleUpperCase('tr'), 'Ç'); +assert.strictEqual('ç'.toUpperCase(), 'Ç'); + if (!common.hasIntl) { const erMsg = '"Intl" object is NOT present but v8_enable_i18n_support is ' +