From 3c5d4bab841a528a229e632e2603985278f0db70 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Sun, 26 Jun 2016 00:50:43 +0900 Subject: [PATCH] #393, Bug 1281739 - Do not match K, S, k, s, KELVIN SIGN, LATIN SMALL LETTER LONG S with \W in unicode ignoreCase RegExp. r=till --- js/src/irregexp/RegExpEngine.cpp | 6 +-- .../RegExp/unicode-ignoreCase-escape.js | 44 ++++++++++++++++--- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/js/src/irregexp/RegExpEngine.cpp b/js/src/irregexp/RegExpEngine.cpp index dfb29b0c2..8ba805ce5 100644 --- a/js/src/irregexp/RegExpEngine.cpp +++ b/js/src/irregexp/RegExpEngine.cpp @@ -94,10 +94,10 @@ static const int kWordAndSurrogateRanges[] = { static const int kWordAndSurrogateRangeCount = ArrayLength(kWordAndSurrogateRanges); static const int kNegatedIgnoreCaseWordAndSurrogateRanges[] = { 0, '0', '9' + 1, 'A', - 'K', 'K' + 1, 'S', 'S' + 1, 'Z' + 1, '_', '_' + 1, 'a', - 'k', 'k' + 1, 's', 's' + 1, - 'z' + 1, unicode::LeadSurrogateMin, + 'z' + 1, 0x017F, + 0x017F + 1, 0x212A, + 0x212A + 1, unicode::LeadSurrogateMin, unicode::TrailSurrogateMax + 1, 0x10000, 0x10000 }; static const int kNegatedIgnoreCaseWordAndSurrogateRangeCount = diff --git a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase-escape.js b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase-escape.js index af5981be0..d731fb6bb 100644 --- a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase-escape.js +++ b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase-escape.js @@ -1,6 +1,10 @@ var BUGNUMBER = 1135377; var summary = "Implement RegExp unicode flag -- ignoreCase flag with character class escape."; +// \W doesn't match S or K from the change in +// https://github.com/tc39/ecma262/pull/525 +// (bug 1281739) + print(BUGNUMBER + ": " + summary); // LATIN SMALL LETTER LONG S @@ -12,13 +16,27 @@ assertEqArray(/\w/iu.exec("s"), assertEqArray(/\w/iu.exec("\u017F"), ["\u017F"]); -assertEqArray(/\W/iu.exec("S"), +assertEqArray(/[^\W]/iu.exec("S"), ["S"]); -assertEqArray(/\W/iu.exec("s"), +assertEqArray(/[^\W]/iu.exec("s"), ["s"]); -assertEqArray(/\W/iu.exec("\u017F"), +assertEqArray(/[^\W]/iu.exec("\u017F"), ["\u017F"]); +assertEq(/\W/iu.exec("S"), + null); +assertEq(/\W/iu.exec("s"), + null); +assertEq(/\W/iu.exec("\u017F"), + null); + +assertEq(/[^\w]/iu.exec("S"), + null); +assertEq(/[^\w]/iu.exec("s"), + null); +assertEq(/[^\w]/iu.exec("\u017F"), + null); + // KELVIN SIGN assertEqArray(/\w/iu.exec("k"), @@ -28,12 +46,26 @@ assertEqArray(/\w/iu.exec("k"), assertEqArray(/\w/iu.exec("\u212A"), ["\u212A"]); -assertEqArray(/\W/iu.exec("k"), +assertEqArray(/[^\W]/iu.exec("k"), ["k"]); -assertEqArray(/\W/iu.exec("k"), +assertEqArray(/[^\W]/iu.exec("k"), ["k"]); -assertEqArray(/\W/iu.exec("\u212A"), +assertEqArray(/[^\W]/iu.exec("\u212A"), ["\u212A"]); +assertEq(/\W/iu.exec("k"), + null); +assertEq(/\W/iu.exec("k"), + null); +assertEq(/\W/iu.exec("\u212A"), + null); + +assertEq(/[^\w]/iu.exec("k"), + null); +assertEq(/[^\w]/iu.exec("k"), + null); +assertEq(/[^\w]/iu.exec("\u212A"), + null); + if (typeof reportCompare === "function") reportCompare(true, true);