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(); |