From 6d3d5a3a3aa04585c0eb67f73374f990f20b69b8 Mon Sep 17 00:00:00 2001 From: Andrei Popescu Date: Tue, 27 Apr 2010 19:40:12 +0100 Subject: [PATCH] Cherry pick http://codereview.chromium.org/1745017/ "Port regexp fix (backslash-b at end of input) to partial snapshots branch." Fix bug: 2632771 Change-Id: I7f4db0c9db76de0cb6408b7e3c17055e030f4d75 --- src/jsregexp.cc | 17 ++++---- test/mjsunit/regexp.js | 96 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 8 deletions(-) diff --git a/src/jsregexp.cc b/src/jsregexp.cc index 40943658..019de685 100644 --- a/src/jsregexp.cc +++ b/src/jsregexp.cc @@ -4844,17 +4844,18 @@ void Analysis::VisitAssertion(AssertionNode* that) { SetRelation word_relation = CharacterRange::WordCharacterRelation(following_chars); - if (word_relation.ContainedIn()) { - // Following character is definitely a word character. + if (word_relation.Disjoint()) { + // Includes the case where following_chars is empty (e.g., end-of-input). + // Following character is definitely *not* a word character. type = (type == AssertionNode::AT_BOUNDARY) ? - AssertionNode::AFTER_NONWORD_CHARACTER : - AssertionNode::AFTER_WORD_CHARACTER; + AssertionNode::AFTER_WORD_CHARACTER : + AssertionNode::AFTER_NONWORD_CHARACTER; that->set_type(type); - } else if (word_relation.Disjoint()) { - // Following character is definitely *not* a word character. + } else if (word_relation.ContainedIn()) { + // Following character is definitely a word character. type = (type == AssertionNode::AT_BOUNDARY) ? - AssertionNode::AFTER_WORD_CHARACTER : - AssertionNode::AFTER_NONWORD_CHARACTER; + AssertionNode::AFTER_NONWORD_CHARACTER : + AssertionNode::AFTER_WORD_CHARACTER; that->set_type(type); } } diff --git a/test/mjsunit/regexp.js b/test/mjsunit/regexp.js index 0a23d00a..a8891969 100644 --- a/test/mjsunit/regexp.js +++ b/test/mjsunit/regexp.js @@ -388,3 +388,99 @@ try { assertTrue(String(e).indexOf("Stack overflow") >= 0, "overflow"); } + +// Test that compile works on modified objects +var re = /re+/; +assertEquals("re+", re.source); +assertFalse(re.global); +assertFalse(re.ignoreCase); +assertFalse(re.multiline); +assertEquals(0, re.lastIndex); + +re.compile("ro+", "gim"); +assertEquals("ro+", re.source); +assertTrue(re.global); +assertTrue(re.ignoreCase); +assertTrue(re.multiline); +assertEquals(0, re.lastIndex); + +re.lastIndex = 42; +re.someOtherProperty = 42; +re.someDeletableProperty = 42; +re[37] = 37; +re[42] = 42; + +re.compile("ra+", "i"); +assertEquals("ra+", re.source); +assertFalse(re.global); +assertTrue(re.ignoreCase); +assertFalse(re.multiline); +assertEquals(0, re.lastIndex); + +assertEquals(42, re.someOtherProperty); +assertEquals(42, re.someDeletableProperty); +assertEquals(37, re[37]); +assertEquals(42, re[42]); + +re.lastIndex = -1; +re.someOtherProperty = 37; +re[42] = 37; +assertTrue(delete re[37]); +assertTrue(delete re.someDeletableProperty); +re.compile("ri+", "gm"); + +assertEquals("ri+", re.source); +assertTrue(re.global); +assertFalse(re.ignoreCase); +assertTrue(re.multiline); +assertEquals(0, re.lastIndex); +assertEquals(37, re.someOtherProperty); +assertEquals(37, re[42]); + +// Test boundary-checks. +function assertRegExpTest(re, input, test) { + assertEquals(test, re.test(input), "test:" + re + ":" + input); +} + +assertRegExpTest(/b\b/, "b", true); +assertRegExpTest(/b\b$/, "b", true); +assertRegExpTest(/\bb/, "b", true); +assertRegExpTest(/^\bb/, "b", true); +assertRegExpTest(/,\b/, ",", false); +assertRegExpTest(/,\b$/, ",", false); +assertRegExpTest(/\b,/, ",", false); +assertRegExpTest(/^\b,/, ",", false); + +assertRegExpTest(/b\B/, "b", false); +assertRegExpTest(/b\B$/, "b", false); +assertRegExpTest(/\Bb/, "b", false); +assertRegExpTest(/^\Bb/, "b", false); +assertRegExpTest(/,\B/, ",", true); +assertRegExpTest(/,\B$/, ",", true); +assertRegExpTest(/\B,/, ",", true); +assertRegExpTest(/^\B,/, ",", true); + +assertRegExpTest(/b\b/, "b,", true); +assertRegExpTest(/b\b/, "ba", false); +assertRegExpTest(/b\B/, "b,", false); +assertRegExpTest(/b\B/, "ba", true); + +assertRegExpTest(/b\Bb/, "bb", true); +assertRegExpTest(/b\bb/, "bb", false); + +assertRegExpTest(/b\b[,b]/, "bb", false); +assertRegExpTest(/b\B[,b]/, "bb", true); +assertRegExpTest(/b\b[,b]/, "b,", true); +assertRegExpTest(/b\B[,b]/, "b,", false); + +assertRegExpTest(/[,b]\bb/, "bb", false); +assertRegExpTest(/[,b]\Bb/, "bb", true); +assertRegExpTest(/[,b]\bb/, ",b", true); +assertRegExpTest(/[,b]\Bb/, ",b", false); + +assertRegExpTest(/[,b]\b[,b]/, "bb", false); +assertRegExpTest(/[,b]\B[,b]/, "bb", true); +assertRegExpTest(/[,b]\b[,b]/, ",b", true); +assertRegExpTest(/[,b]\B[,b]/, ",b", false); +assertRegExpTest(/[,b]\b[,b]/, "b,", true); +assertRegExpTest(/[,b]\B[,b]/, "b,", false);