Array.prototype.splice doesn't set "length" of returned object
authorshvaikalesh@gmail.com <shvaikalesh@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 May 2020 23:50:26 +0000 (23:50 +0000)
committershvaikalesh@gmail.com <shvaikalesh@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 May 2020 23:50:26 +0000 (23:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=212285

Reviewed by Darin Adler.

JSTests:

* test262/expectations.yaml: Mark 2 test cases as passing.

Source/JavaScriptCore:

This change implements step 12 of Array.prototype.splice [1], which is observable
if result object is not JSArray, aligning JSC with V8 and SpiderMonkey.

Only slow path of splice() is affected by this patch; zero-argument case already
performs setLength(). Microbenchmarks are neutral.

[1]: https://tc39.es/ecma262/#sec-array.prototype.splice

* runtime/ArrayPrototype.cpp:
(JSC::arrayProtoFuncSplice):

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

JSTests/ChangeLog
JSTests/test262/expectations.yaml
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ArrayPrototype.cpp

index 3059ea2..c26056a 100644 (file)
@@ -1,3 +1,12 @@
+2020-05-22  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Array.prototype.splice doesn't set "length" of returned object
+        https://bugs.webkit.org/show_bug.cgi?id=212285
+
+        Reviewed by Darin Adler.
+
+        * test262/expectations.yaml: Mark 2 test cases as passing.
+
 2020-05-22  Saam Barati  <sbarati@apple.com>
 
         in_by_val inside structure property for-in loop should use an opcode like has_structure_property but for "in"
index e971d4d..4a6bbc0 100644 (file)
@@ -636,9 +636,6 @@ test/annexB/language/statements/for-of/iterator-close-return-emulates-undefined-
 test/annexB/language/statements/function/default-parameters-emulates-undefined.js:
   default: 'Test262Error: Expected SameValue(«undefined», «[object Function]») to be true'
   strict mode: 'Test262Error: Expected SameValue(«undefined», «[object Function]») to be true'
-test/built-ins/Array/prototype/splice/property-traps-order-with-species.js:
-  default: 'Test262Error: Expected [defineProperty, defineProperty, set, getOwnPropertyDescriptor, defineProperty] and [defineProperty, defineProperty] to have the same contents. '
-  strict mode: 'Test262Error: Expected [defineProperty, defineProperty, set, getOwnPropertyDescriptor, defineProperty] and [defineProperty, defineProperty] to have the same contents. '
 test/built-ins/ArrayBuffer/prototype/byteLength/detached-buffer.js:
   default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
   strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
index 873b1ba..e831e7f 100644 (file)
@@ -1,3 +1,21 @@
+2020-05-22  Alexey Shvayka  <shvaikalesh@gmail.com>
+
+        Array.prototype.splice doesn't set "length" of returned object
+        https://bugs.webkit.org/show_bug.cgi?id=212285
+
+        Reviewed by Darin Adler.
+
+        This change implements step 12 of Array.prototype.splice [1], which is observable
+        if result object is not JSArray, aligning JSC with V8 and SpiderMonkey.
+
+        Only slow path of splice() is affected by this patch; zero-argument case already
+        performs setLength(). Microbenchmarks are neutral.
+
+        [1]: https://tc39.es/ecma262/#sec-array.prototype.splice
+
+        * runtime/ArrayPrototype.cpp:
+        (JSC::arrayProtoFuncSplice):
+
 2020-05-22  Saam Barati  <sbarati@apple.com>
 
         in_by_val inside structure property for-in loop should use an opcode like has_structure_property but for "in"
index 4e07f55..eaa0f1f 100644 (file)
@@ -1217,6 +1217,8 @@ EncodedJSValue JSC_HOST_CALL arrayProtoFuncSplice(JSGlobalObject* globalObject,
             result->putDirectIndex(globalObject, k, v, 0, PutDirectIndexShouldThrow);
             RETURN_IF_EXCEPTION(scope, encodedJSValue());
         }
+        setLength(globalObject, vm, result, actualDeleteCount);
+        RETURN_IF_EXCEPTION(scope, { });
     }
 
     if (itemCount < actualDeleteCount) {