REGRESSION (r200946): Improper backtracking from last alternative in sticky patterns
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Jun 2016 00:38:58 +0000 (00:38 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Jun 2016 00:38:58 +0000 (00:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159233

Reviewed by Mark Lam.

Source/JavaScriptCore:

Jump to fail exit code when the last alternative of a sticky pattern fails.

* yarr/YarrJIT.cpp:
(JSC::Yarr::YarrGenerator::backtrack):

LayoutTests:

Updated tests.

* js/regexp-sticky-expected.txt:
* js/script-tests/regexp-sticky.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@202597 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/regexp-sticky-expected.txt
LayoutTests/js/script-tests/regexp-sticky.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/yarr/YarrJIT.cpp

index 2a9a10f..5177a25 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-28  Michael Saboff  <msaboff@apple.com>
+
+        REGRESSION (r200946): Improper backtracking from last alternative in sticky patterns
+        https://bugs.webkit.org/show_bug.cgi?id=159233
+
+        Reviewed by Mark Lam.
+
+        Updated tests.
+
+        * js/regexp-sticky-expected.txt:
+        * js/script-tests/regexp-sticky.js:
+
 2016-06-28  Ryan Haddad  <ryanhaddad@apple.com>
 
         Marking fast/images/composited-animated-gif-outside-viewport.html as flaky on ios-simulator
index 2e697aa..bb9fe86 100644 (file)
@@ -26,10 +26,12 @@ PASS Character Classes
 PASS Unmatched Greedy
 PASS Global Flag - exec
 PASS Global Flag - match
+PASS Global Flag - Alternates, long to short
 PASS Unicode Flag - Any Character
 PASS Unicode & Ignore Case Flags
 PASS Multiline
 PASS Multiline with BOL Anchor
+PASS Multiline with EOL Anchor at start of Alternative
 PASS "123 1234 ".search(re) is 0
 PASS "123 1234 ".search(re) is 0
 PASS " 123 1234 ".search(re) is -1
index 6176802..d989e8b 100644 (file)
@@ -92,10 +92,12 @@ testStickyMatch("Character Classes", /[0-9A-F]/iy, "fEEd123X", 0, [["f"], ["E"],
 testStickyExec("Unmatched Greedy", /^\s*|\s*$/y, "ab", 1, [null]);
 testStickyExec("Global Flag - exec", /\s*(\+|[0-9]+)\s*/gy, "3 + 4", 0, ["3 ,3", "+ ,+", "4,4", null]);
 testStickyMatch("Global Flag - match", /\s*(\+|[0-9]+)\s*/gy, "3 + 4", 0, [["3 ", "+ ", "4"], ["3 ", "+ ", "4"]]);
+testStickyMatch("Global Flag - Alternates, long to short", /x.|[\d]/gy, ".a", 0, [null]);
 testStickyExec("Unicode Flag - Any Character", /./uy, "a@\u{10402}1\u202a\u{12345}", 0, ["a", "@", "\u{10402}", "1", "\u202a", "\u{12345}", null]);
 testStickyMatch("Unicode & Ignore Case Flags", /(?:\u{118c0}|\u{10cb0}|\w):/iuy, "a:\u{118a0}:x:\u{10cb0}", 0, [["a:"], ["\u{118a0}:"], ["x:"], null]);
 testStickyExec("Multiline", /(?:\w+ *)+(?:\n|$)/my, "Line One\nLine Two", 0, ["Line One\n", "Line Two", null]);
 testStickyMatch("Multiline with BOL Anchor", /^\d*\s?/my, "13574\n295\n99", 0, [["13574\n"], ["295\n"], ["99"], null]);
+testStickyExec("Multiline with EOL Anchor at start of Alternative", /.{2}|(?=$)./my, "\n", 0, [null]);
 
 // Verify that String.search starts at 0 even with the sticky flag.
 var re = new RegExp("\\d+\\s", "y");
index e486b42..c344202 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-28  Michael Saboff  <msaboff@apple.com>
+
+        REGRESSION (r200946): Improper backtracking from last alternative in sticky patterns
+        https://bugs.webkit.org/show_bug.cgi?id=159233
+
+        Reviewed by Mark Lam.
+
+        Jump to fail exit code when the last alternative of a sticky pattern fails.
+
+        * yarr/YarrJIT.cpp:
+        (JSC::Yarr::YarrGenerator::backtrack):
+
 2016-06-28  Saam Barati  <sbarati@apple.com>
 
         some Watchpoints' ::fireInternal method will call operations that might GC where the GC will cause the watchpoint itself to destruct
index 5ba831c..f53238e 100644 (file)
@@ -1828,6 +1828,8 @@ class YarrGenerator : private MacroAssembler {
                 }
 
                 bool onceThrough = endOp.m_nextOp == notFound;
+                
+                JumpList lastStickyAlternativeFailures;
 
                 // First, generate code to handle cases where we backtrack out of an attempted match
                 // of the last alternative. If this is a 'once through' set of alternatives then we
@@ -1843,12 +1845,15 @@ class YarrGenerator : private MacroAssembler {
                         && (alternative->m_minimumSize > beginOp->m_alternative->m_minimumSize)
                         && (alternative->m_minimumSize - beginOp->m_alternative->m_minimumSize == 1))
                         m_backtrackingState.linkTo(beginOp->m_reentry, this);
-                    else {
+                    else if (m_pattern.sticky() && m_ops[op.m_nextOp].m_op == OpBodyAlternativeEnd) {
+                        // It is a sticky pattern and the last alternative failed, jump to the end.
+                        m_backtrackingState.takeBacktracksToJumpList(lastStickyAlternativeFailures, this);
+                    } else {
                         // We need to generate a trampoline of code to execute before looping back
                         // around to the first alternative.
                         m_backtrackingState.link(this);
 
-                        // No need to advance and retry for a stick pattern.
+                        // No need to advance and retry for a sticky pattern.
                         if (!m_pattern.sticky()) {
                             // If the pattern size is not fixed, then store the start index for use if we match.
                             if (!m_pattern.m_body->m_hasFixedSize) {
@@ -1998,6 +2003,8 @@ class YarrGenerator : private MacroAssembler {
                     // run any matches, and need to return a failure state from JIT code.
                     matchFailed.link(this);
                 }
+
+                lastStickyAlternativeFailures.link(this);
                 removeCallFrame();
                 generateFailReturn();
                 break;