Index: src/typedarray.js |
diff --git a/src/typedarray.js b/src/typedarray.js |
index 88fbb34245f3223001897c1108b68b926fd7f761..cba8993c236227cb81bbc66eeb27c5c70aeaa005 100644 |
--- a/src/typedarray.js |
+++ b/src/typedarray.js |
@@ -49,12 +49,20 @@ endmacro |
macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { |
+ if (!IS_UNDEFINED(byteOffset)) { |
+ byteOffset = |
+ ToPositiveInteger(byteOffset, "invalid_typed_array_length"); |
+ } |
+ if (!IS_UNDEFINED(length)) { |
+ length = ToPositiveInteger(length, "invalid_typed_array_length"); |
+ } |
+ |
var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
var offset; |
if (IS_UNDEFINED(byteOffset)) { |
offset = 0; |
} else { |
- offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length"); |
+ offset = byteOffset; |
if (offset % ELEMENT_SIZE !== 0) { |
throw MakeRangeError("invalid_typed_array_alignment", |
@@ -75,7 +83,7 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
newByteLength = bufferByteLength - offset; |
newLength = newByteLength / ELEMENT_SIZE; |
} else { |
- var newLength = ToPositiveInteger(length, "invalid_typed_array_length"); |
+ var newLength = length; |
newByteLength = newLength * ELEMENT_SIZE; |
} |
if ((offset + newByteLength > bufferByteLength) |
@@ -99,6 +107,7 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
function NAMEConstructByArrayLike(obj, arrayLike) { |
var length = arrayLike.length; |
var l = ToPositiveInteger(length, "invalid_typed_array_length"); |
+ |
if (l > %MaxSmi()) { |
throw MakeRangeError("invalid_typed_array_length"); |
} |
@@ -148,15 +157,19 @@ function TypedArrayGetLength() { |
function CreateSubArray(elementSize, constructor) { |
return function(begin, end) { |
- var srcLength = %TypedArrayGetLength(this); |
var beginInt = TO_INTEGER(begin); |
+ if (!IS_UNDEFINED(end)) { |
+ end = TO_INTEGER(end); |
+ } |
+ |
+ var srcLength = %TypedArrayGetLength(this); |
if (beginInt < 0) { |
beginInt = MathMax(0, srcLength + beginInt); |
} else { |
beginInt = MathMin(srcLength, beginInt); |
} |
- var endInt = IS_UNDEFINED(end) ? srcLength : TO_INTEGER(end); |
+ var endInt = IS_UNDEFINED(end) ? srcLength : end; |
if (endInt < 0) { |
endInt = MathMax(0, srcLength + endInt); |
} else { |
@@ -317,14 +330,23 @@ function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 |
if (!IS_ARRAYBUFFER(buffer)) { |
throw MakeTypeError('data_view_not_array_buffer', []); |
} |
+ if (!IS_UNDEFINED(byteOffset)) { |
+ byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); |
+ } |
+ if (!IS_UNDEFINED(byteLength)) { |
+ byteLength = TO_INTEGER(byteLength); |
+ } |
+ |
var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
- var offset = IS_UNDEFINED(byteOffset) ? |
- 0 : ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); |
+ |
+ var offset = IS_UNDEFINED(byteOffset) ? 0 : byteOffset; |
if (offset > bufferByteLength) { |
throw MakeRangeError('invalid_data_view_offset'); |
} |
- var length = IS_UNDEFINED(byteLength) ? |
- bufferByteLength - offset : TO_INTEGER(byteLength); |
+ |
+ var length = IS_UNDEFINED(byteLength) |
+ ? bufferByteLength - offset |
+ : byteLength; |
if (length < 0 || offset + length > bufferByteLength) { |
throw new MakeRangeError('invalid_data_view_length'); |
} |