Chromium Code Reviews| Index: src/harmony-typedarray.js |
| diff --git a/src/harmony-typedarray.js b/src/harmony-typedarray.js |
| index 90679e0c1fe1afffb6b6b7115e93719e02d7b0c1..d82f75a615169e7a23145125cad5321c66292e77 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,50 @@ 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); |
| + |
| + var length = %_TypedArrayGetLength(this); |
| + var array = $innerArrayMap(predicate, thisArg, this, length); |
| + return ConstructTypedArrayLike(this, array); |
|
arv (Not doing code reviews)
2015/05/18 22:54:23
This one can be preallocated instead of using a te
dehrenberg
2015/05/19 00:13:45
Done.
|
| +} |
| +%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 +213,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 |