2010-10-14 Peter Varga <pvarga@inf.u-szeged.hu>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Oct 2010 18:00:55 +0000 (18:00 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Oct 2010 18:00:55 +0000 (18:00 +0000)
        Reviewed by Gavin Barraclough.

        The backreference checking isn't working in some cases with YARR Interpreter
        https://bugs.webkit.org/show_bug.cgi?id=46904

        The Interpreter::matchBackReference() function returns true without matching
        when a backreference points to the same parentheses where it is.

        * yarr/RegexInterpreter.cpp:
        (JSC::Yarr::Interpreter::matchBackReference):

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

JavaScriptCore/ChangeLog
JavaScriptCore/yarr/RegexInterpreter.cpp

index 0162e3e..afee301 100644 (file)
@@ -1,3 +1,16 @@
+2010-10-14  Peter Varga  <pvarga@inf.u-szeged.hu>
+
+        Reviewed by Gavin Barraclough.
+
+        The backreference checking isn't working in some cases with YARR Interpreter
+        https://bugs.webkit.org/show_bug.cgi?id=46904
+
+        The Interpreter::matchBackReference() function returns true without matching
+        when a backreference points to the same parentheses where it is.
+
+        * yarr/RegexInterpreter.cpp:
+        (JSC::Yarr::Interpreter::matchBackReference):
+
 2010-10-14  No'am Rosenthal  <noam.rosenthal@nokia.com>
 
         Reviewed by Andreas Kling.
index 1b3f620..efeae80 100644 (file)
@@ -495,6 +495,13 @@ public:
 
         int matchBegin = output[(term.atom.subpatternId << 1)];
         int matchEnd = output[(term.atom.subpatternId << 1) + 1];
+
+        // If the end position of the referenced match hasn't set yet then the backreference in the same parentheses where it references to that.
+        // In this case the result of match is empty string like when it references to a parentheses with zero-width match.
+        // Eg.: /(a\1)/
+        if (matchEnd == -1)
+            return true;
+
         ASSERT((matchBegin == -1) == (matchEnd == -1));
         ASSERT(matchBegin <= matchEnd);