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 |