| // Copyright 2014 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 | |
| assertEquals(1, Array.prototype.fill.length); | |
| assertArrayEquals([].fill(8), []); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(), [undefined, undefined, undefined, undefined, undefined]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8), [8, 8, 8, 8, 8]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, 1), [0, 8, 8, 8, 8]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, 10), [0, 0, 0, 0, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, -5), [8, 8, 8, 8, 8]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, 1, 4), [0, 8, 8, 8, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, 1, -1), [0, 8, 8, 8, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, 1, 42), [0, 8, 8, 8, 8]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, -3, 42), [0, 0, 8, 8, 8]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, -3, 4), [0, 0, 8, 8, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, -2, -1), [0, 0, 0, 8, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, -1, -3), [0, 0, 0, 0, 0]); | |
| assertArrayEquals([0, 0, 0, 0, 0].fill(8, undefined, 4), [8, 8, 8, 8, 0]); | |
| assertArrayEquals([ , , , , 0].fill(8, 1, 3), [, 8, 8, , 0]); | |
| // If the range is empty, the array is not actually modified and | |
| // should not throw, even when applied to a frozen object. | |
| assertArrayEquals(Object.freeze([1, 2, 3]).fill(0, 0, 0), [1, 2, 3]); | |
| // Test exceptions | |
| assertThrows('Object.freeze([0]).fill()', TypeError); | |
| assertThrows('Array.prototype.fill.call(null)', TypeError); | |
| assertThrows('Array.prototype.fill.call(undefined)', TypeError); | |
| function TestFillObjectWithAccessors() { | |
| const kLength = 5; | |
| let log = []; | |
| let object = { | |
| length: kLength, | |
| get 1() { | |
| log.push("get 1"); | |
| return this.foo; | |
| }, | |
| set 1(val) { | |
| log.push("set 1 " + val); | |
| this.foo = val; | |
| } | |
| }; | |
| Array.prototype.fill.call(object, 42); | |
| %HeapObjectVerify(object); | |
| assertEquals(kLength, object.length); | |
| assertArrayEquals(["set 1 42"], log); | |
| for (let i = 0; i < kLength; ++i) { | |
| assertEquals(42, object[i]); | |
| } | |
| } | |
| TestFillObjectWithAccessors(); | |
| function TestFillObjectWithMaxNumberLength() { | |
| const kMaxSafeInt = 2 ** 53 - 1; | |
| let object = {}; | |
| object.length = kMaxSafeInt; | |
| Array.prototype.fill.call(object, 42, 2 ** 53 - 4); | |
| %HeapObjectVerify(object); | |
| assertEquals(kMaxSafeInt, object.length); | |
| assertEquals(42, object[kMaxSafeInt - 3]); | |
| assertEquals(42, object[kMaxSafeInt - 2]); | |
| assertEquals(42, object[kMaxSafeInt - 1]); | |
| } | |
| TestFillObjectWithMaxNumberLength(); | |
| function TestFillObjectWithPrototypeAccessors() { | |
| const kLength = 5; | |
| let log = []; | |
| let proto = { | |
| get 1() { | |
| log.push("get 0"); | |
| return this.foo; | |
| }, | |
| set 1(val) { | |
| log.push("set 1 " + val); | |
| this.foo = val; | |
| } | |
| }; | |
| let object = { __proto__: proto, 0:0, 2:2, length: kLength}; | |
| Array.prototype.fill.call(object, "42"); | |
| %HeapObjectVerify(object); | |
| assertEquals(kLength, object.length); | |
| assertArrayEquals(["set 1 42"], log); | |
| assertTrue(object.hasOwnProperty(0)); | |
| assertFalse(object.hasOwnProperty(1)); | |
| assertTrue(object.hasOwnProperty(2)); | |
| assertTrue(object.hasOwnProperty(3)); | |
| assertTrue(object.hasOwnProperty(4)); | |
| for (let i = 0; i < kLength; ++i) { | |
| assertEquals("42", object[i]); | |
| } | |
| } | |
| TestFillObjectWithPrototypeAccessors(); | |
| function TestFillSealedObject() { | |
| let object = { length: 42 }; | |
| Object.seal(object); | |
| assertThrows(() => Array.prototype.fill.call(object), TypeError); | |
| } | |
| TestFillSealedObject(); | |
| function TestFillFrozenObject() { | |
| let object = { length: 42 }; | |
| Object.freeze(object); | |
| assertThrows(() => Array.prototype.fill.call(object), TypeError); | |
| } | |
| TestFillFrozenObject(); |