Chromium Code Reviews| Index: src/typedarray.js |
| diff --git a/src/typedarray.js b/src/typedarray.js |
| index 4e3b9385863a20c94234d3dc63bafb31191e31f1..2d89b0c2cbcaa7825f2a218cee7abb0c99d9157f 100644 |
| --- a/src/typedarray.js |
| +++ b/src/typedarray.js |
| @@ -147,6 +147,40 @@ function NAME_GetLength() { |
| var $NAME = global.NAME; |
| +function NAMESlice(begin, end) { |
| + if (!(%_ClassOf(this) === 'NAME')) { |
|
arv (Not doing code reviews)
2015/05/01 14:09:31
This is not quite right. We need to use ValidateTy
|
| + throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.slice", this); |
| + } |
| + var beginInt = TO_INTEGER(begin); |
| + if (!IS_UNDEFINED(end)) { |
| + end = TO_INTEGER(end); |
| + } |
| + |
| + var srcLength = %_TypedArrayGetLength(this); |
| + if (beginInt < 0) { |
| + beginInt = $max(0, srcLength + beginInt); |
| + } else { |
| + beginInt = $min(srcLength, beginInt); |
| + } |
| + |
| + var endInt = IS_UNDEFINED(end) ? srcLength : end; |
| + if (endInt < 0) { |
| + endInt = $max(0, srcLength + endInt); |
| + } else { |
| + endInt = $min(endInt, srcLength); |
| + } |
| + if (endInt < beginInt) { |
| + endInt = beginInt; |
| + } |
| + var newLength = endInt - beginInt; |
| + var beginByteOffset = |
| + %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; |
| + var arrayBuffer = %TypedArrayGetBuffer(this); |
| + var arrayBufferSlice = new GlobalArrayBuffer(newLength * ELEMENT_SIZE); |
| + %ArrayBufferSliceImpl(arrayBuffer, arrayBufferSlice, beginByteOffset); |
| + return new $NAME(arrayBufferSlice, 0, newLength); |
| +} |
| + |
| function NAMESubArray(begin, end) { |
| if (!(%_ClassOf(this) === 'NAME')) { |
| throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.subarray", this); |
| @@ -317,6 +351,7 @@ macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) |
| InstallGetter(global.NAME.prototype, symbolToStringTag, |
| TypedArrayGetToStringTag); |
| InstallFunctions(global.NAME.prototype, DONT_ENUM, [ |
| + "slice", NAMESlice, |
| "subarray", NAMESubArray, |
| "set", TypedArraySet |
| ]); |