[JSC] Update RegExp.prototype.[@@search]] implementation according to the latest...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Jun 2017 18:01:40 +0000 (18:01 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Jun 2017 18:01:40 +0000 (18:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173227

Reviewed by Mark Lam.

JSTests:

Update the test.

* es6/Proxy_internal_get_calls_RegExp.prototype[Symbol.search].js:

Source/JavaScriptCore:

The latest spec introduces slight change to RegExp.prototype.[@@search].
This patch applies this change. Basically, this change is done in the slow path of
the RegExp.prototype[@@search].
https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search

* builtins/RegExpPrototype.js:
(search):

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

JSTests/ChangeLog
JSTests/es6/Proxy_internal_get_calls_RegExp.prototype[Symbol.search].js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/builtins/RegExpPrototype.js

index f6931c1..91a9e77 100644 (file)
@@ -1,3 +1,14 @@
+2017-06-10  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Update RegExp.prototype.[@@search]] implementation according to the latest spec
+        https://bugs.webkit.org/show_bug.cgi?id=173227
+
+        Reviewed by Mark Lam.
+
+        Update the test.
+
+        * es6/Proxy_internal_get_calls_RegExp.prototype[Symbol.search].js:
+
 2017-06-08  Keith Miller  <keith_miller@apple.com>
 
         WebAssembly: We should only create wrappers for functions that can be exported
index c1a2e59..5f68ae4 100644 (file)
@@ -4,7 +4,7 @@ function test() {
 var get = [];
 var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
 RegExp.prototype[Symbol.search].call(p);
-return get + '' === "lastIndex,exec";
+return get + '' === "lastIndex,exec,lastIndex";
       
 }
 
index 033d17c..5edf714 100644 (file)
@@ -1,3 +1,18 @@
+2017-06-10  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Update RegExp.prototype.[@@search]] implementation according to the latest spec
+        https://bugs.webkit.org/show_bug.cgi?id=173227
+
+        Reviewed by Mark Lam.
+
+        The latest spec introduces slight change to RegExp.prototype.[@@search].
+        This patch applies this change. Basically, this change is done in the slow path of
+        the RegExp.prototype[@@search].
+        https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search
+
+        * builtins/RegExpPrototype.js:
+        (search):
+
 2017-06-09  Chris Dumez  <cdumez@apple.com>
 
         Update Thread::create() to take in a WTF::Function instead of a std::function
index 017a81c..af9ef38 100644 (file)
@@ -316,16 +316,28 @@ function search(strArg)
 
     // 4. Let previousLastIndex be ? Get(rx, "lastIndex").
     let previousLastIndex = regexp.lastIndex;
-    // 5. Perform ? Set(rx, "lastIndex", 0, true).
-    regexp.lastIndex = 0;
+
+    // 5.If SameValue(previousLastIndex, 0) is false, then
+    // 5.a. Perform ? Set(rx, "lastIndex", 0, true).
+    // FIXME: Add SameValue support. https://bugs.webkit.org/show_bug.cgi?id=173226
+    if (previousLastIndex !== 0)
+        regexp.lastIndex = 0;
+
     // 6. Let result be ? RegExpExec(rx, S).
     let result = @regExpExec(regexp, str);
-    // 7. Perform ? Set(rx, "lastIndex", previousLastIndex, true).
-    regexp.lastIndex = previousLastIndex;
-    // 8. If result is null, return -1.
+
+    // 7. Let currentLastIndex be ? Get(rx, "lastIndex").
+    // 8. If SameValue(currentLastIndex, previousLastIndex) is false, then
+    // 8.a. Perform ? Set(rx, "lastIndex", previousLastIndex, true).
+    // FIXME: Add SameValue support. https://bugs.webkit.org/show_bug.cgi?id=173226
+    if (regexp.lastIndex !== previousLastIndex)
+        regexp.lastIndex = previousLastIndex;
+
+    // 9. If result is null, return -1.
     if (result === null)
         return -1;
-    // 9. Return ? Get(result, "index").
+
+    // 10. Return ? Get(result, "index").
     return result.index;
 }