| Index: src/harmony-typedarray.js
|
| diff --git a/src/harmony-typedarray.js b/src/harmony-typedarray.js
|
| index 90679e0c1fe1afffb6b6b7115e93719e02d7b0c1..b1115f4fb4c953ff5ec24d0b15f94e1e538a645a 100644
|
| --- a/src/harmony-typedarray.js
|
| +++ b/src/harmony-typedarray.js
|
| @@ -30,6 +30,28 @@ DECLARE_GLOBALS(Array)
|
|
|
| // -------------------------------------------------------------------
|
|
|
| +function ConstructTypedArray(constructor, array) {
|
| + // TODO(littledan): This is an approximation of the spec, which requires
|
| + // that only real TypedArray classes should be accepted (22.2.2.1.1)
|
| + if (!IS_SPEC_OBJECT(constructor) || IS_UNDEFINED(constructor.prototype) ||
|
| + !%HasOwnProperty(constructor.prototype, "BYTES_PER_ELEMENT")) {
|
| + throw MakeTypeError(kNotTypedArray);
|
| + }
|
| +
|
| + // TODO(littledan): The spec requires that, rather than directly calling
|
| + // the constructor, a TypedArray is created with the proper proto and
|
| + // underlying size and element size, and elements are put in one by one.
|
| + // By contrast, this would allow subclasses to make a radically different
|
| + // constructor with different semantics.
|
| + return new constructor(array);
|
| +}
|
| +
|
| +function ConstructTypedArrayLike(typedArray, arrayContents) {
|
| + // TODO(littledan): The spec requires that we actuallly use
|
| + // typedArray.constructor[Symbol.species] (bug v8:4093)
|
| + return new typedArray.constructor(arrayContents);
|
| +}
|
| +
|
| function TypedArrayCopyWithin(target, start, end) {
|
| if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
|
|
| @@ -61,7 +83,7 @@ function TypedArrayForEach(f, receiver) {
|
| %FunctionSetLength(TypedArrayForEach, 1);
|
|
|
| // ES6 draft 04-05-14 section 22.2.3.8
|
| -function TypedArrayFill(value, start , end) {
|
| +function TypedArrayFill(value, start, end) {
|
| if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
|
|
| var length = %_TypedArrayGetLength(this);
|
| @@ -70,6 +92,16 @@ function TypedArrayFill(value, start , end) {
|
| }
|
| %FunctionSetLength(TypedArrayFill, 1);
|
|
|
| +// ES6 draft 07-15-13, section 22.2.3.9
|
| +function TypedArrayFilter(predicate, thisArg) {
|
| + if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| +
|
| + var length = %_TypedArrayGetLength(this);
|
| + var array = $innerArrayFilter(predicate, thisArg, this, length);
|
| + return ConstructTypedArrayLike(this, array);
|
| +}
|
| +%FunctionSetLength(TypedArrayFilter, 1);
|
| +
|
| // ES6 draft 07-15-13, section 22.2.3.10
|
| function TypedArrayFind(predicate, thisArg) {
|
| if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| @@ -91,6 +123,52 @@ function TypedArrayFindIndex(predicate, thisArg) {
|
| %FunctionSetLength(TypedArrayFindIndex, 1);
|
|
|
|
|
| +// ES6 draft 07-15-13, section 22.2.3.18
|
| +function TypedArrayMap(predicate, thisArg) {
|
| + if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| +
|
| + // TODO(littledan): Preallocate rather than making an intermediate
|
| + // array, for better performance.
|
| + var length = %_TypedArrayGetLength(this);
|
| + var array = $innerArrayMap(predicate, thisArg, this, length);
|
| + return ConstructTypedArrayLike(this, array);
|
| +}
|
| +%FunctionSetLength(TypedArrayMap, 1);
|
| +
|
| +
|
| +// ES6 draft 07-15-13, section 22.2.3.19
|
| +function TypedArrayReduce(callback, current) {
|
| + if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| +
|
| + var length = %_TypedArrayGetLength(this);
|
| + return $innerArrayReduce(callback, current, this, length,
|
| + %_ArgumentsLength());
|
| +}
|
| +%FunctionSetLength(TypedArrayReduce, 1);
|
| +
|
| +
|
| +// ES6 draft 07-15-13, section 22.2.3.19
|
| +function TypedArrayReduceRight(callback, current) {
|
| + if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| +
|
| + var length = %_TypedArrayGetLength(this);
|
| + return $innerArrayReduceRight(callback, current, this, length,
|
| + %_ArgumentsLength());
|
| +}
|
| +%FunctionSetLength(TypedArrayReduceRight, 1);
|
| +
|
| +
|
| +// ES6 draft 05-05-15, section 22.2.3.24
|
| +function TypedArraySome(f, receiver) {
|
| + if (!%IsTypedArray(this)) throw MakeTypeError(kNotTypedArray);
|
| +
|
| + var length = %_TypedArrayGetLength(this);
|
| +
|
| + return $innerArraySome(f, receiver, this, length);
|
| +}
|
| +%FunctionSetLength(TypedArraySome, 1);
|
| +
|
| +
|
| // ES6 draft 08-24-14, section 22.2.2.2
|
| function TypedArrayOf() {
|
| var length = %_ArgumentsLength();
|
| @@ -137,10 +215,15 @@ macro EXTEND_TYPED_ARRAY(NAME)
|
| $installFunctions(GlobalNAME.prototype, DONT_ENUM, [
|
| "copyWithin", TypedArrayCopyWithin,
|
| "every", TypedArrayEvery,
|
| - "forEach", TypedArrayForEach,
|
| + "fill", TypedArrayFill,
|
| + "filter", TypedArrayFilter,
|
| "find", TypedArrayFind,
|
| "findIndex", TypedArrayFindIndex,
|
| - "fill", TypedArrayFill
|
| + "forEach", TypedArrayForEach,
|
| + "map", TypedArrayMap,
|
| + "reduce", TypedArrayReduce,
|
| + "reduceRight", TypedArrayReduceRight,
|
| + "some", TypedArraySome
|
| ]);
|
| endmacro
|
|
|
|
|