| Index: src/typedarray.js
|
| diff --git a/src/typedarray.js b/src/typedarray.js
|
| index 267d43d514f78c1597c621a11e3195cb7aacab23..d2f5ae8692355f0ef289979f8c57b99cc9f3e277 100644
|
| --- a/src/typedarray.js
|
| +++ b/src/typedarray.js
|
| @@ -25,163 +25,163 @@ FUNCTION(9, Uint8ClampedArray, 1)
|
| 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 = byteOffset;
|
| +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");
|
| + }
|
|
|
| - if (offset % ELEMENT_SIZE !== 0) {
|
| - throw MakeRangeError("invalid_typed_array_alignment",
|
| - ["start offset", "NAME", ELEMENT_SIZE]);
|
| - }
|
| - if (offset > bufferByteLength) {
|
| - throw MakeRangeError("invalid_typed_array_offset");
|
| - }
|
| - }
|
| + var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
|
| + var offset;
|
| + if (IS_UNDEFINED(byteOffset)) {
|
| + offset = 0;
|
| + } else {
|
| + offset = byteOffset;
|
|
|
| - var newByteLength;
|
| - var newLength;
|
| - if (IS_UNDEFINED(length)) {
|
| - if (bufferByteLength % ELEMENT_SIZE !== 0) {
|
| - throw MakeRangeError("invalid_typed_array_alignment",
|
| - ["byte length", "NAME", ELEMENT_SIZE]);
|
| - }
|
| - newByteLength = bufferByteLength - offset;
|
| - newLength = newByteLength / ELEMENT_SIZE;
|
| - } else {
|
| - var newLength = length;
|
| - newByteLength = newLength * ELEMENT_SIZE;
|
| + if (offset % ELEMENT_SIZE !== 0) {
|
| + throw MakeRangeError("invalid_typed_array_alignment",
|
| + ["start offset", "NAME", ELEMENT_SIZE]);
|
| }
|
| - if ((offset + newByteLength > bufferByteLength)
|
| - || (newLength > %_MaxSmi())) {
|
| - throw MakeRangeError("invalid_typed_array_length");
|
| + if (offset > bufferByteLength) {
|
| + throw MakeRangeError("invalid_typed_array_offset");
|
| }
|
| - %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
|
| }
|
|
|
| - function NAMEConstructByLength(obj, length) {
|
| - var l = IS_UNDEFINED(length) ?
|
| - 0 : ToPositiveInteger(length, "invalid_typed_array_length");
|
| - if (l > %_MaxSmi()) {
|
| - throw MakeRangeError("invalid_typed_array_length");
|
| - }
|
| - var byteLength = l * ELEMENT_SIZE;
|
| - if (byteLength > %_TypedArrayMaxSizeInHeap()) {
|
| - var buffer = new $ArrayBuffer(byteLength);
|
| - %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
|
| - } else {
|
| - %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength);
|
| + var newByteLength;
|
| + var newLength;
|
| + if (IS_UNDEFINED(length)) {
|
| + if (bufferByteLength % ELEMENT_SIZE !== 0) {
|
| + throw MakeRangeError("invalid_typed_array_alignment",
|
| + ["byte length", "NAME", ELEMENT_SIZE]);
|
| }
|
| + newByteLength = bufferByteLength - offset;
|
| + newLength = newByteLength / ELEMENT_SIZE;
|
| + } else {
|
| + var newLength = length;
|
| + newByteLength = newLength * ELEMENT_SIZE;
|
| }
|
| + if ((offset + newByteLength > bufferByteLength)
|
| + || (newLength > %_MaxSmi())) {
|
| + throw MakeRangeError("invalid_typed_array_length");
|
| + }
|
| + %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
|
| +}
|
|
|
| - function NAMEConstructByArrayLike(obj, arrayLike) {
|
| - var length = arrayLike.length;
|
| - var l = ToPositiveInteger(length, "invalid_typed_array_length");
|
| +function NAMEConstructByLength(obj, length) {
|
| + var l = IS_UNDEFINED(length) ?
|
| + 0 : ToPositiveInteger(length, "invalid_typed_array_length");
|
| + if (l > %_MaxSmi()) {
|
| + throw MakeRangeError("invalid_typed_array_length");
|
| + }
|
| + var byteLength = l * ELEMENT_SIZE;
|
| + if (byteLength > %_TypedArrayMaxSizeInHeap()) {
|
| + var buffer = new $ArrayBuffer(byteLength);
|
| + %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
|
| + } else {
|
| + %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength);
|
| + }
|
| +}
|
|
|
| - if (l > %_MaxSmi()) {
|
| - throw MakeRangeError("invalid_typed_array_length");
|
| - }
|
| - if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
|
| - for (var i = 0; i < l; i++) {
|
| - // It is crucial that we let any execptions from arrayLike[i]
|
| - // propagate outside the function.
|
| - obj[i] = arrayLike[i];
|
| - }
|
| +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");
|
| + }
|
| + if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
|
| + for (var i = 0; i < l; i++) {
|
| + // It is crucial that we let any execptions from arrayLike[i]
|
| + // propagate outside the function.
|
| + obj[i] = arrayLike[i];
|
| }
|
| }
|
| +}
|
|
|
| - function NAMEConstructor(arg1, arg2, arg3) {
|
| - if (%_IsConstructCall()) {
|
| - if (IS_ARRAYBUFFER(arg1)) {
|
| - NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
|
| - } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
|
| - IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
|
| - NAMEConstructByLength(this, arg1);
|
| - } else {
|
| - NAMEConstructByArrayLike(this, arg1);
|
| - }
|
| +function NAMEConstructor(arg1, arg2, arg3) {
|
| + if (%_IsConstructCall()) {
|
| + if (IS_ARRAYBUFFER(arg1)) {
|
| + NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
|
| + } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
|
| + IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
|
| + NAMEConstructByLength(this, arg1);
|
| } else {
|
| - throw MakeTypeError("constructor_not_function", ["NAME"])
|
| + NAMEConstructByArrayLike(this, arg1);
|
| }
|
| + } else {
|
| + throw MakeTypeError("constructor_not_function", ["NAME"])
|
| }
|
| +}
|
|
|
| - function NAME_GetBuffer() {
|
| - if (!(%_ClassOf(this) === 'NAME')) {
|
| - throw MakeTypeError('incompatible_method_receiver',
|
| - ["NAME.buffer", this]);
|
| - }
|
| - return %TypedArrayGetBuffer(this);
|
| +function NAME_GetBuffer() {
|
| + if (!(%_ClassOf(this) === 'NAME')) {
|
| + throw MakeTypeError('incompatible_method_receiver',
|
| + ["NAME.buffer", this]);
|
| }
|
| + return %TypedArrayGetBuffer(this);
|
| +}
|
|
|
| - function NAME_GetByteLength() {
|
| - if (!(%_ClassOf(this) === 'NAME')) {
|
| - throw MakeTypeError('incompatible_method_receiver',
|
| - ["NAME.byteLength", this]);
|
| - }
|
| - return %_ArrayBufferViewGetByteLength(this);
|
| +function NAME_GetByteLength() {
|
| + if (!(%_ClassOf(this) === 'NAME')) {
|
| + throw MakeTypeError('incompatible_method_receiver',
|
| + ["NAME.byteLength", this]);
|
| }
|
| + return %_ArrayBufferViewGetByteLength(this);
|
| +}
|
|
|
| - function NAME_GetByteOffset() {
|
| - if (!(%_ClassOf(this) === 'NAME')) {
|
| - throw MakeTypeError('incompatible_method_receiver',
|
| - ["NAME.byteOffset", this]);
|
| - }
|
| - return %_ArrayBufferViewGetByteOffset(this);
|
| +function NAME_GetByteOffset() {
|
| + if (!(%_ClassOf(this) === 'NAME')) {
|
| + throw MakeTypeError('incompatible_method_receiver',
|
| + ["NAME.byteOffset", this]);
|
| }
|
| + return %_ArrayBufferViewGetByteOffset(this);
|
| +}
|
|
|
| - function NAME_GetLength() {
|
| - if (!(%_ClassOf(this) === 'NAME')) {
|
| - throw MakeTypeError('incompatible_method_receiver',
|
| - ["NAME.length", this]);
|
| - }
|
| - return %_TypedArrayGetLength(this);
|
| +function NAME_GetLength() {
|
| + if (!(%_ClassOf(this) === 'NAME')) {
|
| + throw MakeTypeError('incompatible_method_receiver',
|
| + ["NAME.length", this]);
|
| }
|
| + return %_TypedArrayGetLength(this);
|
| +}
|
|
|
| - var $NAME = global.NAME;
|
| +var $NAME = global.NAME;
|
|
|
| - function NAMESubArray(begin, end) {
|
| - if (!(%_ClassOf(this) === 'NAME')) {
|
| - throw MakeTypeError('incompatible_method_receiver',
|
| - ["NAME.subarray", this]);
|
| - }
|
| - var beginInt = TO_INTEGER(begin);
|
| - if (!IS_UNDEFINED(end)) {
|
| - end = TO_INTEGER(end);
|
| - }
|
| +function NAMESubArray(begin, end) {
|
| + if (!(%_ClassOf(this) === 'NAME')) {
|
| + throw MakeTypeError('incompatible_method_receiver',
|
| + ["NAME.subarray", 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 srcLength = %_TypedArrayGetLength(this);
|
| + if (beginInt < 0) {
|
| + beginInt = MathMax(0, srcLength + beginInt);
|
| + } else {
|
| + beginInt = MathMin(srcLength, beginInt);
|
| + }
|
|
|
| - var endInt = IS_UNDEFINED(end) ? srcLength : end;
|
| - if (endInt < 0) {
|
| - endInt = MathMax(0, srcLength + endInt);
|
| - } else {
|
| - endInt = MathMin(endInt, srcLength);
|
| - }
|
| - if (endInt < beginInt) {
|
| - endInt = beginInt;
|
| - }
|
| - var newLength = endInt - beginInt;
|
| - var beginByteOffset =
|
| - %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;
|
| - return new $NAME(%TypedArrayGetBuffer(this),
|
| - beginByteOffset, newLength);
|
| + var endInt = IS_UNDEFINED(end) ? srcLength : end;
|
| + if (endInt < 0) {
|
| + endInt = MathMax(0, srcLength + endInt);
|
| + } else {
|
| + endInt = MathMin(endInt, srcLength);
|
| + }
|
| + if (endInt < beginInt) {
|
| + endInt = beginInt;
|
| }
|
| + var newLength = endInt - beginInt;
|
| + var beginByteOffset =
|
| + %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;
|
| + return new $NAME(%TypedArrayGetBuffer(this),
|
| + beginByteOffset, newLength);
|
| +}
|
| endmacro
|
|
|
| TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
|
| @@ -357,7 +357,7 @@ function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3
|
| }
|
| }
|
|
|
| -function DataViewGetBuffer() {
|
| +function DataViewGetBufferJS() {
|
| if (!IS_DATAVIEW(this)) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['DataView.buffer', this]);
|
| @@ -398,7 +398,7 @@ function ToPositiveDataViewOffset(offset) {
|
|
|
|
|
| macro DATA_VIEW_GETTER_SETTER(TYPENAME)
|
| -function DataViewGetTYPENAME(offset, little_endian) {
|
| +function DataViewGetTYPENAMEJS(offset, little_endian) {
|
| if (!IS_DATAVIEW(this)) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['DataView.getTYPENAME', this]);
|
| @@ -411,7 +411,7 @@ function DataViewGetTYPENAME(offset, little_endian) {
|
| !!little_endian);
|
| }
|
|
|
| -function DataViewSetTYPENAME(offset, value, little_endian) {
|
| +function DataViewSetTYPENAMEJS(offset, value, little_endian) {
|
| if (!IS_DATAVIEW(this)) {
|
| throw MakeTypeError('incompatible_method_receiver',
|
| ['DataView.setTYPENAME', this]);
|
| @@ -438,34 +438,34 @@ function SetupDataView() {
|
| // Set up constructor property on the DataView prototype.
|
| %SetProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM);
|
|
|
| - InstallGetter($DataView.prototype, "buffer", DataViewGetBuffer);
|
| + InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS);
|
| InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset);
|
| InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength);
|
|
|
| InstallFunctions($DataView.prototype, DONT_ENUM, $Array(
|
| - "getInt8", DataViewGetInt8,
|
| - "setInt8", DataViewSetInt8,
|
| + "getInt8", DataViewGetInt8JS,
|
| + "setInt8", DataViewSetInt8JS,
|
|
|
| - "getUint8", DataViewGetUint8,
|
| - "setUint8", DataViewSetUint8,
|
| + "getUint8", DataViewGetUint8JS,
|
| + "setUint8", DataViewSetUint8JS,
|
|
|
| - "getInt16", DataViewGetInt16,
|
| - "setInt16", DataViewSetInt16,
|
| + "getInt16", DataViewGetInt16JS,
|
| + "setInt16", DataViewSetInt16JS,
|
|
|
| - "getUint16", DataViewGetUint16,
|
| - "setUint16", DataViewSetUint16,
|
| + "getUint16", DataViewGetUint16JS,
|
| + "setUint16", DataViewSetUint16JS,
|
|
|
| - "getInt32", DataViewGetInt32,
|
| - "setInt32", DataViewSetInt32,
|
| + "getInt32", DataViewGetInt32JS,
|
| + "setInt32", DataViewSetInt32JS,
|
|
|
| - "getUint32", DataViewGetUint32,
|
| - "setUint32", DataViewSetUint32,
|
| + "getUint32", DataViewGetUint32JS,
|
| + "setUint32", DataViewSetUint32JS,
|
|
|
| - "getFloat32", DataViewGetFloat32,
|
| - "setFloat32", DataViewSetFloat32,
|
| + "getFloat32", DataViewGetFloat32JS,
|
| + "setFloat32", DataViewSetFloat32JS,
|
|
|
| - "getFloat64", DataViewGetFloat64,
|
| - "setFloat64", DataViewSetFloat64
|
| + "getFloat64", DataViewGetFloat64JS,
|
| + "setFloat64", DataViewSetFloat64JS
|
| ));
|
| }
|
|
|
|
|