summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/es6/array-fill-receiver.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/es6/array-fill-receiver.js')
-rw-r--r--deps/v8/test/mjsunit/es6/array-fill-receiver.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/es6/array-fill-receiver.js b/deps/v8/test/mjsunit/es6/array-fill-receiver.js
new file mode 100644
index 0000000000..21d7a2ab03
--- /dev/null
+++ b/deps/v8/test/mjsunit/es6/array-fill-receiver.js
@@ -0,0 +1,118 @@
+// Copyright 2018 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+// Ensure `Array.prototype.fill` functions correctly for numerous elements
+// kinds.
+
+// If no arguments are provided, call Array.p.fill without any arguments,
+// otherwise the test is allowed to specify what value to use to better control
+// ElementsKind transitions. From and to is provided by the harness.
+function callAndAssertFill(object, test_value, harness_value, from, to) {
+ let value = arguments.length > 2 ? test_value : harness_value;
+
+ Array.prototype.fill.call(object, value, from, to);
+
+ %HeapObjectVerify(object);
+ assertArrayHasValueInRange(object, value, from, to);
+}
+
+function assertArrayHasValueInRange(obj, value, from, to) {
+ for (let i = from; i < to; ++i) {
+ assertEquals(value, obj[i]);
+ }
+}
+
+// Tests are executed multiple times. Creating arrays using literal notation
+// will create COW-Arrays, which will propagate the most general ElementsKind
+// back to their allocation site.
+// pristineArray will always return a 🐄-Array with the ElementsKind we actually
+// want.
+let i = 0;
+function pristineArray(str) {
+ return eval(str + "//" + (i++));
+}
+
+let tests = {
+ ARRAY_PACKED_ELEMENTS(value, from, to) {
+ let array = pristineArray(
+ `["Some string", {}, /foobar/, "Another string", {}]`);
+ assertTrue(%HasObjectElements(array));
+ assertFalse(%HasHoleyElements(array));
+
+ callAndAssertFill(array, "42", ...arguments);
+ },
+
+ ARRAY_HOLEY_ELEMENTS(value, from, to) {
+ let array = pristineArray(`["Some string", , {}, , "Another string"]`);
+ assertTrue(%HasObjectElements(array));
+ assertTrue(%HasHoleyElements(array));
+
+ callAndAssertFill(array, "42", ...arguments);
+ },
+
+ ARRAY_PACKED_SMI_ELEMENTS(value, from, to) {
+ let array = pristineArray(`[0, -42, 5555, 23, 6]`);
+ assertTrue(%HasSmiElements(array));
+ assertFalse(%HasHoleyElements(array));
+
+ callAndAssertFill(array, 42, ...arguments);
+ },
+
+ ARRAY_HOLEY_SMI_ELEMENTS(value, from, to) {
+ let array = pristineArray(`[0, , 5555, , 6]`);
+ assertTrue(%HasSmiElements(array));
+ assertTrue(%HasHoleyElements(array));
+
+ callAndAssertFill(array, 42, ...arguments);
+ },
+
+ ARRAY_PACKED_DOUBLE_ELEMENTS(value, from, to) {
+ let array = pristineArray(`[3.14, 7.00001, NaN, -25.3333, 1.0]`);
+ assertTrue(%HasDoubleElements(array));
+ assertFalse(%HasHoleyElements(array));
+
+ callAndAssertFill(array, 42.42, ...arguments);
+ },
+
+ ARRAY_HOLEY_DOUBLE_ELEMENTS(value, from, to) {
+ let array = pristineArray(`[3.14, , , , 1.0]`);
+ assertTrue(%HasDoubleElements(array));
+ assertTrue(%HasHoleyElements(array));
+
+ callAndAssertFill(array, 42.42, ...arguments);
+ },
+
+ ARRAY_DICTIONARY_ELEMENTS(value, from, to) {
+ let array = pristineArray(`[0, , 2, 3, 4]`);
+ Object.defineProperty(array, 1, { get() { return this.foo; },
+ set(val) { this.foo = val; }});
+ assertTrue(%HasDictionaryElements(array));
+
+ callAndAssertFill(array, "42", ...arguments);
+ }
+
+ // TODO(szuend): Add additional tests receivers other than arrays
+ // (Objects, TypedArrays, etc.).
+};
+
+function RunTest(test) {
+ test();
+ test(undefined);
+ test(undefined, 1);
+ test(undefined, 1, 4);
+}
+
+function RunTests(tests) {
+ Object.keys(tests).forEach(test => RunTest(tests[test]));
+}
+
+RunTests(tests);
+
+Array.prototype.__proto__ = {
+ __proto__: Array.prototype.__proto__
+};
+
+RunTests(tests);