Chromium Code Reviews| Index: src/typedarray.js |
| diff --git a/src/typedarray.js b/src/typedarray.js |
| index 7549652e1fa2ef92c68bc8a02127cafef99c9a27..4e50f7f3dffdb46eadecca0b3faf3bd7587b9c1c 100644 |
| --- a/src/typedarray.js |
| +++ b/src/typedarray.js |
| @@ -85,42 +85,54 @@ function ArrayBufferSlice(start, end) { |
| // --------------- Typed Arrays --------------------- |
| function CreateTypedArrayConstructor(name, elementSize, arrayId, constructor) { |
| - return function (buffer, byteOffset, length) { |
| - if (%_IsConstructCall()) { |
| - if (!IS_ARRAYBUFFER(buffer)) { |
| - throw MakeTypeError("Type error!"); |
| - } |
| - var offset = IS_UNDEFINED(byteOffset) |
| - ? 0 : offset = TO_POSITIVE_INTEGER(byteOffset); |
| + function ConstructByArrayBuffer(obj, buffer, byteOffset, length) { |
| + var offset = IS_UNDEFINED(byteOffset) |
| + ? 0 : offset = TO_POSITIVE_INTEGER(byteOffset); |
| + |
| + if (offset % elementSize !== 0) { |
| + throw MakeRangeError("invalid_typed_array_alignment", |
| + "start offset", name, elementSize); |
| + } |
| + var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
| + if (offset >= bufferByteLength) { |
| + throw MakeRangeError("invalid_typed_array_offset"); |
| + } |
| - if (offset % elementSize !== 0) { |
| + var newByteLength; |
| + var newLength; |
| + if (IS_UNDEFINED(length)) { |
| + if (bufferByteLength % elementSize !== 0) { |
| throw MakeRangeError("invalid_typed_array_alignment", |
| - "start offset", name, elementSize); |
| - } |
| - var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
| - if (offset >= bufferByteLength) { |
| - throw MakeRangeError("invalid_typed_array_offset"); |
| + "byte length", name, elementSize); |
| } |
| + newByteLength = bufferByteLength - offset; |
| + newLength = newByteLength / elementSize; |
| + } else { |
| + var newLength = TO_POSITIVE_INTEGER(length); |
| + newByteLength = newLength * elementSize; |
| + } |
| + if (newByteLength > bufferByteLength) { |
| + throw MakeRangeError("invalid_typed_array_length"); |
| + } |
| + %TypedArrayInitialize(obj, arrayId, buffer, offset, newByteLength); |
| + } |
| + |
| + function ConstructByLength(obj, length) { |
| + var l = IS_UNDEFINED(length) ? 0 : TO_POSITIVE_INTEGER(length); |
| + var byteLength = l * elementSize; |
| + var buffer = new $ArrayBuffer(byteLength); |
| + %TypedArrayInitialize(obj, arrayId, buffer, 0, byteLength); |
| + } |
| - var newByteLength; |
| - var newLength; |
| - if (IS_UNDEFINED(length)) { |
| - if (bufferByteLength % elementSize !== 0) { |
| - throw MakeRangeError("invalid_typed_array_alignment", |
| - "byte length", name, elementSize); |
| - } |
| - newByteLength = bufferByteLength - offset; |
| - newLength = newByteLength / elementSize; |
| + return function (arg1, arg2, arg3) { |
| + if (%_IsConstructCall()) { |
|
rossberg
2013/04/29 15:17:15
Nit: if you negate this condition, you can avoid t
|
| + if (IS_ARRAYBUFFER(arg1)) { |
| + ConstructByArrayBuffer(this, arg1, arg2, arg3); |
| } else { |
| - var newLength = TO_POSITIVE_INTEGER(length); |
| - newByteLength = newLength * elementSize; |
| - } |
| - if (newByteLength > bufferByteLength) { |
| - throw MakeRangeError("invalid_typed_array_length"); |
| + ConstructByLength(this, arg1); |
| } |
| - %TypedArrayInitialize(this, arrayId, buffer, offset, newByteLength); |
| } else { |
| - return new constructor(buffer, byteOffset, length); |
| + return new constructor(arg1, arg2, arg3); |
| } |
| } |
| } |
| @@ -164,9 +176,10 @@ function SetUpArrayBuffer() { |
| SetUpArrayBuffer(); |
| function SetupTypedArray(arrayId, name, constructor, elementSize) { |
| - var f = CreateTypedArrayConstructor(name, elementSize, |
| - arrayId, constructor); |
| - %SetCode(constructor, f); |
| + %CheckIsBootstrapping(); |
| + var fun = CreateTypedArrayConstructor(name, elementSize, |
| + arrayId, constructor); |
| + %SetCode(constructor, fun); |
| %FunctionSetPrototype(constructor, new $Object()); |
| %SetProperty(constructor.prototype, |