| // Copyright 2016 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. |
| |
| // https://bugs.chromium.org/p/chromium/issues/detail?id=595319 |
| // Ensure exceptions are checked for by Array.prototype.concat from adding |
| // an element, and that elements are added to array subclasses appropriately |
| |
| // If adding a property does throw, the exception is propagated |
| class MyException extends Error { } |
| class NoDefinePropertyArray extends Array { |
| constructor(...args) { |
| super(...args); |
| return new Proxy(this, { |
| defineProperty() { throw new MyException(); } |
| }); |
| } |
| } |
| assertThrows(() => new NoDefinePropertyArray().concat([1]), MyException); |
| |
| // Ensure elements are added to the instance, rather than calling [[Set]]. |
| class ZeroGetterArray extends Array { get 0() {} }; |
| assertArrayEquals([1], new ZeroGetterArray().concat(1)); |
| |
| // Frozen arrays lead to throwing |
| |
| class FrozenArray extends Array { |
| constructor(...args) { super(...args); Object.freeze(this); } |
| } |
| assertThrows(() => new FrozenArray().concat([1]), TypeError); |
| |
| // Non-configurable non-writable zero leads to throwing |
| class ZeroFrozenArray extends Array { |
| constructor(...args) { |
| super(...args); |
| Object.defineProperty(this, 0, {value: 1}); |
| } |
| } |
| assertThrows(() => new ZeroFrozenArray().concat([1]), TypeError); |