String.prototype.replace() puts extra '<' in result when a named capture reference...
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2017 00:20:36 +0000 (00:20 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Sep 2017 00:20:36 +0000 (00:20 +0000)
https://bugs.webkit.org/show_bug.cgi?id=176814

Reviewed by Mark Lam.

Source/JavaScriptCore:

The copy and advance indices where off by one and needed a little fine tuning.

* runtime/StringPrototype.cpp:
(JSC::substituteBackreferencesSlow):

LayoutTests:

New regression test case.

* js/regexp-named-capture-groups-expected.txt:
* js/script-tests/regexp-named-capture-groups.js:

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

LayoutTests/ChangeLog
LayoutTests/js/regexp-named-capture-groups-expected.txt
LayoutTests/js/script-tests/regexp-named-capture-groups.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/StringPrototype.cpp

index 816b90b..d35aa6f 100644 (file)
@@ -1,3 +1,15 @@
+2017-09-12  Michael Saboff  <msaboff@apple.com>
+
+        String.prototype.replace() puts extra '<' in result when a named capture reference is used without named captures in the RegExp
+        https://bugs.webkit.org/show_bug.cgi?id=176814
+
+        Reviewed by Mark Lam.
+
+        New regression test case.
+
+        * js/regexp-named-capture-groups-expected.txt:
+        * js/script-tests/regexp-named-capture-groups.js:
+
 2017-09-12  Myles C. Maxfield  <mmaxfield@apple.com>
 
         ASSERTION FAILED: !m_valueOrException under FontFaceSet::completedLoading loading a Serious Eats page
index 3d85f6a..3930203 100644 (file)
@@ -45,6 +45,7 @@ PASS "10/20/1930".replace(/(?<month>\d{2})\/(?<day>\d{2})\/(?<year>\d{4})/, "$<d
 PASS "10/20/1930".replace(/(?<month>\d{2})\/(?<day>\d{2})\/(?<year>\d{4})/, "$2-$<month>-$<year>") is "20-10-1930"
 PASS "10/20/1930".replace(/(?<month>\d{2})\/(?<day>\d{2})\/(?<year>\d{4})/, "$<day>-$1-$<year>") is "20-10-1930"
 PASS "10/20/1930".replace(/(?<month>\d{2})\/(?<day>\d{2})\/(?<year>\d{4})/, "$<day>-$<month>-$3") is "20-10-1930"
+PASS "Replace just THIS in this string".replace(/THIS/, "$<THAT>") is "Replace just $<THAT> in this string"
 PASS "Give me a \'k\'!".match(/Give me a \'\k\'/)[0] is "Give me a \'k\'"
 PASS "Give me \'k2\'!".match(/Give me \'\k2\'/)[0] is "Give me \'k2\'"
 PASS "Give me a \'kat\'!".match(/Give me a \'\kat\'/)[0] is "Give me a \'kat\'"
index 3a408e4..00d7f66 100644 (file)
@@ -77,6 +77,9 @@ shouldBe('"10/20/1930".replace(/(?<month>\\d{2})\\\/(?<day>\\d{2})\\\/(?<year>\\
 shouldBe('"10/20/1930".replace(/(?<month>\\d{2})\\\/(?<day>\\d{2})\\\/(?<year>\\d{4})/, "$<day>-$1-$<year>")', '"20-10-1930"');
 shouldBe('"10/20/1930".replace(/(?<month>\\d{2})\\\/(?<day>\\d{2})\\\/(?<year>\\d{4})/, "$<day>-$<month>-$3")', '"20-10-1930"');
 
+// Verify String.replace works correctly without named captures in the RegExp
+shouldBe('"Replace just THIS in this string".replace(/THIS/, "$<THAT>")', '"Replace just $<THAT> in this string"');
+
 // Verify that named back references for non-existing named group matches the k<groupName> for non-unicode patterns.
 shouldBe('"Give me a \\\'k\\\'!".match(/Give me a \\\'\\\k\\\'/)[0]', '"Give me a \\\'k\\\'"');
 shouldBe('"Give me \\\'k2\\\'!".match(/Give me \\\'\\\k2\\\'/)[0]', '"Give me \\\'k2\\\'"');
index 8c82f3e..db79ba1 100644 (file)
@@ -1,3 +1,15 @@
+2017-09-12  Michael Saboff  <msaboff@apple.com>
+
+        String.prototype.replace() puts extra '<' in result when a named capture reference is used without named captures in the RegExp
+        https://bugs.webkit.org/show_bug.cgi?id=176814
+
+        Reviewed by Mark Lam.
+
+        The copy and advance indices where off by one and needed a little fine tuning.
+
+        * runtime/StringPrototype.cpp:
+        (JSC::substituteBackreferencesSlow):
+
 2017-09-11  Mark Lam  <mark.lam@apple.com>
 
         More exception check book-keeping needed found by 32-bit JSC test failures.
index 1e7dc61..97f79fa 100644 (file)
@@ -213,7 +213,8 @@ static NEVER_INLINE String substituteBackreferencesSlow(StringView replacement,
             // Named back reference
             if (!hasNamedCaptures) {
                 substitutedReplacement.append(replacement.substring(i, 2));
-                offset = i + 1;
+                offset = i + 2;
+                advance = 1;
                 continue;
             }