2bd9bdbe62
This patch improves ArrayBuffer and TypedArray subclassing by adding support for @@species and constructing outputs to certain methods by creating an instance of the constructor determined by the SpeciesConstructor algorithm, rather than fixed to a superclass or naively the constructor. The new behavior is enabled by the --harmony-species flag. Care is taken to not significantly change the observable behavior when the flag is off. Previously, TypedArrays already supported subclassing by reading the constructor of the receiver, but ArrayBuffers did not, and this old behavior is preserved and tested for, to avoid a multi-stage upgrade path and keep things simple for users. R=adamk BUG=v8:4093 LOG=Y Review URL: https://codereview.chromium.org/1574903004 Cr-Commit-Position: refs/heads/master@{#33223}
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
// Copyright 2015 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: --harmony-species
|
|
|
|
// ArrayBuffer.prototype.slice makes subclass and checks length
|
|
|
|
class MyArrayBuffer extends ArrayBuffer { }
|
|
assertEquals(MyArrayBuffer, new MyArrayBuffer(0).slice().constructor);
|
|
|
|
class MyShortArrayBuffer extends ArrayBuffer {
|
|
constructor(length) { super(length - 1); }
|
|
}
|
|
assertThrows(() => new MyShortArrayBuffer(5).slice(0, 4), TypeError);
|
|
|
|
class SingletonArrayBuffer extends ArrayBuffer {
|
|
constructor(...args) {
|
|
if (SingletonArrayBuffer.cached) return SingletonArrayBuffer.cached;
|
|
super(...args);
|
|
SingletonArrayBuffer.cached = this;
|
|
}
|
|
}
|
|
assertThrows(() => new SingletonArrayBuffer(5).slice(0, 4), TypeError);
|
|
|
|
class NonArrayBuffer extends ArrayBuffer {
|
|
constructor() {
|
|
return {};
|
|
}
|
|
}
|
|
assertThrows(() => new NonArrayBuffer(5).slice(0, 4), TypeError);
|
|
|
|
// Species fallback is ArrayBuffer
|
|
class UndefinedArrayBuffer extends ArrayBuffer { }
|
|
UndefinedArrayBuffer.prototype.constructor = undefined;
|
|
assertEquals(ArrayBuffer, new UndefinedArrayBuffer(0).slice().constructor);
|