7acee1ef61
This patch fixes two bugs in Array.prototype.concat in conjunction with subclassing Arrays: - Create a new property rather than calling Set when adding elements to the output array. This means setters are not called. - If there is an exception thrown from DefineProperty, propagate it outwards properly, rather than swallowing it. This can occur, e.g., with a Proxy as the new output array. R=adamk LOG=Y BUG=chromium:595319 Review URL: https://codereview.chromium.org/1814933002 Cr-Commit-Position: refs/heads/master@{#34876}
40 lines
1.4 KiB
JavaScript
40 lines
1.4 KiB
JavaScript
// 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);
|