summaryrefslogtreecommitdiffstats
path: root/js/src/irregexp/RegExpEngine.cpp
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2017-08-17 20:37:46 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-03-12 14:59:13 +0100
commit70a4d7e010785cf1857510aed711282b25f0c659 (patch)
tree9676e643f7a9e474462abc426f9589ff767f80c2 /js/src/irregexp/RegExpEngine.cpp
parentb392e6d2ea60191615771900690b37b52b47bcd3 (diff)
downloadUXP-70a4d7e010785cf1857510aed711282b25f0c659.tar
UXP-70a4d7e010785cf1857510aed711282b25f0c659.tar.gz
UXP-70a4d7e010785cf1857510aed711282b25f0c659.tar.lz
UXP-70a4d7e010785cf1857510aed711282b25f0c659.tar.xz
UXP-70a4d7e010785cf1857510aed711282b25f0c659.zip
JS - RegExp - match updated spec for `/\b/iu` and `/\B/iu`
Diffstat (limited to 'js/src/irregexp/RegExpEngine.cpp')
-rw-r--r--js/src/irregexp/RegExpEngine.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/js/src/irregexp/RegExpEngine.cpp b/js/src/irregexp/RegExpEngine.cpp
index 0011e976f..4d691a5dc 100644
--- a/js/src/irregexp/RegExpEngine.cpp
+++ b/js/src/irregexp/RegExpEngine.cpp
@@ -2255,7 +2255,10 @@ void
BoyerMoorePositionInfo::SetInterval(const Interval& interval)
{
s_ = AddRange(s_, kSpaceRanges, kSpaceRangeCount, interval);
- w_ = AddRange(w_, kWordRanges, kWordRangeCount, interval);
+ if (unicode_ignore_case_)
+ w_ = AddRange(w_, kIgnoreCaseWordRanges, kIgnoreCaseWordRangeCount, interval);
+ else
+ w_ = AddRange(w_, kWordRanges, kWordRangeCount, interval);
d_ = AddRange(d_, kDigitRanges, kDigitRangeCount, interval);
surrogate_ =
AddRange(surrogate_, kSurrogateRanges, kSurrogateRangeCount, interval);
@@ -2292,11 +2295,12 @@ BoyerMoorePositionInfo::SetAll()
BoyerMooreLookahead::BoyerMooreLookahead(LifoAlloc* alloc, size_t length, RegExpCompiler* compiler)
: length_(length), compiler_(compiler), bitmaps_(*alloc)
{
+ bool unicode_ignore_case = compiler->unicode() && compiler->ignore_case();
max_char_ = MaximumCharacter(compiler->ascii());
bitmaps_.reserve(length);
for (size_t i = 0; i < length; i++)
- bitmaps_.append(alloc->newInfallible<BoyerMoorePositionInfo>(alloc));
+ bitmaps_.append(alloc->newInfallible<BoyerMoorePositionInfo>(alloc, unicode_ignore_case));
}
// Find the longest range of lookahead that has the fewest number of different
@@ -2962,15 +2966,22 @@ EmitNotInSurrogatePair(RegExpCompiler* compiler, RegExpNode* on_success, Trace*
// Check for [0-9A-Z_a-z].
static void
EmitWordCheck(RegExpMacroAssembler* assembler,
- jit::Label* word, jit::Label* non_word, bool fall_through_on_word)
+ jit::Label* word, jit::Label* non_word, bool fall_through_on_word,
+ bool unicode_ignore_case)
{
- if (assembler->CheckSpecialCharacterClass(fall_through_on_word ? 'w' : 'W',
+ if (!unicode_ignore_case &&
+ assembler->CheckSpecialCharacterClass(fall_through_on_word ? 'w' : 'W',
fall_through_on_word ? non_word : word))
{
// Optimized implementation available.
return;
}
+ if (unicode_ignore_case) {
+ assembler->CheckCharacter(0x017F, word);
+ assembler->CheckCharacter(0x212A, word);
+ }
+
assembler->CheckCharacterGT('z', non_word);
assembler->CheckCharacterLT('0', non_word);
assembler->CheckCharacterGT('a' - 1, word);
@@ -3019,7 +3030,8 @@ AssertionNode::EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace)
assembler->LoadCurrentCharacter(trace->cp_offset(), &before_non_word);
}
// Fall through on non-word.
- EmitWordCheck(assembler, &before_word, &before_non_word, false);
+ EmitWordCheck(assembler, &before_word, &before_non_word, false,
+ compiler->unicode() && compiler->ignore_case());
// Next character is not a word character.
assembler->Bind(&before_non_word);
jit::Label ok;
@@ -3059,7 +3071,8 @@ AssertionNode::BacktrackIfPrevious(RegExpCompiler* compiler,
// We already checked that we are not at the start of input so it must be
// OK to load the previous character.
assembler->LoadCurrentCharacter(new_trace.cp_offset() - 1, &dummy, false);
- EmitWordCheck(assembler, word, non_word, backtrack_if_previous == kIsNonWord);
+ EmitWordCheck(assembler, word, non_word, backtrack_if_previous == kIsNonWord,
+ compiler->unicode() && compiler->ignore_case());
assembler->Bind(&fall_through);
on_success()->Emit(compiler, &new_trace);