v8/test/mjsunit/harmony/arraybuffer-species.js
littledan 2bd9bdbe62 TypedArray and ArrayBuffer support for @@species
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}
2016-01-12 06:07:59 +00:00

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);