Chromium Code Reviews| Index: src/typedarray.js |
| diff --git a/src/typedarray.js b/src/typedarray.js |
| index 04c487f43ce70131252a736295fbf3598ed6f884..a3a855c2a86f431ded0793449e5fd2c3241f6600 100644 |
| --- a/src/typedarray.js |
| +++ b/src/typedarray.js |
| @@ -197,3 +197,267 @@ SetupTypedArray(6, "Int32Array", global.Int32Array, 4); |
| SetupTypedArray(7, "Float32Array", global.Float32Array, 4); |
| SetupTypedArray(8, "Float64Array", global.Float64Array, 8); |
| SetupTypedArray(9, "Uint8ClampedArray", global.Uint8ClampedArray, 1); |
| + |
| + |
| +// --------------------------- DataView ----------------------------- |
| + |
| +var $DataView = global.DataView; |
| + |
| +function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 |
| + if (%_IsConstructCall()) { |
| + if (!IS_ARRAYBUFFER(buffer)) { |
| + throw MakeTypeError('data_view_not_array_buffer',[]); |
| + } |
| + var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
| + var offset = IS_UNDEFINED(byteOffset) ? 0 : TO_POSITIVE_INTEGER(byteOffset); |
| + if (offset > bufferByteLength) { |
| + throw MakeRangeError('invalid_data_view_offset',[]); |
|
rossberg
2013/06/21 08:44:01
Nit: space after comma
Dmitry Lomov (no reviews)
2013/06/21 11:32:10
Done.
|
| + } |
| + var length = IS_UNDEFINED(byteLength) ? |
| + bufferByteLength - offset : TO_POSITIVE_INTEGER(byteLength); |
| + if (offset + length > bufferByteLength) { |
| + throw new MakeRangeError('invalid_data_view_length'); |
| + } |
| + %DataViewInitialize(this, buffer, offset, length); |
| + } else { |
| + return new $DataView(buffer, byteOffset, byteLength) |
| + } |
| +} |
| + |
| +function DataViewGetBuffer() { |
| + return %DataViewGetBuffer(this); |
| +} |
| + |
| +function DataViewGetByteOffset() { |
| + return %DataViewGetByteOffset(this); |
| +} |
| + |
| +function DataViewGetByteLength() { |
| + return %DataViewGetByteLength(this); |
| +} |
| + |
| +function DataViewGetInt8(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getInt8', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
|
rossberg
2013/06/21 08:44:01
Don't use redundant 'var' (here and below).
Also,
Dmitry Lomov (no reviews)
2013/06/21 11:32:10
Done.
|
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetInt8(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetInt8(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setInt8', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetInt8(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetUint8(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getUint8', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetUint8(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetUint8(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setUint8', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetUint8(this, offset, value, little_endian); |
| +} |
| +function DataViewGetInt16(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getInt16', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetInt16(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetInt16(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setInt16', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetInt16(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetUint16(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getUint16', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetUint16(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetUint16(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setUint16', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetUint16(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetInt32(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getInt32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetInt32(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetInt32(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setInt32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetInt32(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetUint32(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getUint32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetUint32(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetUint32(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setUint32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetUint32(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetFloat32(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getFloat32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetFloat32(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetFloat32(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setFloat32', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetFloat32(this, offset, value, little_endian); |
| +} |
| + |
| +function DataViewGetFloat64(offset, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.getFloat64', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + return %DataViewGetFloat64(this, offset, little_endian); |
| +} |
| + |
| +function DataViewSetFloat64(offset, value, little_endian) { |
| + if (!IS_DATAVIEW(this)) { |
| + throw MakeTypeError('incompatible_method_reciever', |
| + ['DataView.setFloat64', this]); |
| + } |
| + var little_endian = IS_UNDEFINED(little_endian) |
| + ? false : (little_endian ? true : false); |
| + var value = TO_NUMBER_INLINE(value); |
| + var offset = TO_POSITIVE_INTEGER(offset); |
| + %DataViewSetFloat64(this, offset, value, little_endian); |
| +} |
| + |
| +function SetupDataView() { |
| + %CheckIsBootstrapping(); |
| + |
| + // Setup the DataView constructor. |
| + %SetCode($DataView, DataViewConstructor); |
| + %FunctionSetPrototype($DataView, new $Object); |
| + |
| + // Set up constructor property on the DataView prototype. |
| + %SetProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM); |
| + |
| + InstallGetter($DataView.prototype, "buffer", DataViewGetBuffer); |
| + InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset); |
| + InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength); |
| + |
| + InstallFunctions($DataView.prototype, DONT_ENUM, $Array( |
| + "getInt8", DataViewGetInt8, |
| + "setInt8", DataViewSetInt8, |
| + |
| + "getUint8", DataViewGetUint8, |
| + "setUint8", DataViewSetUint8, |
| + |
| + "getInt16", DataViewGetInt16, |
| + "setInt16", DataViewSetInt16, |
| + |
| + "getUint16", DataViewGetUint16, |
| + "setUint16", DataViewSetUint16, |
| + |
| + "getInt32", DataViewGetInt32, |
| + "setInt32", DataViewSetInt32, |
| + |
| + "getUint32", DataViewGetUint32, |
| + "setUint32", DataViewSetUint32, |
| + |
| + "getFloat32", DataViewGetFloat32, |
| + "setFloat32", DataViewSetFloat32, |
| + |
| + "getFloat64", DataViewGetFloat64, |
| + "setFloat64", DataViewSetFloat64 |
| + )); |
| +} |
| + |
| +SetupDataView(); |