| 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()) {
|
| + 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,
|
|
|