Index: src/typedarray.js |
diff --git a/src/typedarray.js b/src/typedarray.js |
index 04c487f43ce70131252a736295fbf3598ed6f884..0e0b7fec63187c14edee2d32310f51f2cbd99df4 100644 |
--- a/src/typedarray.js |
+++ b/src/typedarray.js |
@@ -197,3 +197,248 @@ 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', []); |
+ } |
+ 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() { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.buffer', this]); |
+ } |
+ return %DataViewGetBuffer(this); |
+} |
+ |
+function DataViewGetByteOffset() { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.byteOffset', this]); |
+ } |
+ return %DataViewGetByteOffset(this); |
+} |
+ |
+function DataViewGetByteLength() { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.byteLength', this]); |
+ } |
+ return %DataViewGetByteLength(this); |
+} |
+ |
+function DataViewGetInt8(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getInt8', this]); |
+ } |
+ return %DataViewGetInt8(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetInt8(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setInt8', this]); |
+ } |
+ %DataViewSetInt8(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetUint8(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getUint8', this]); |
+ } |
+ return %DataViewGetUint8(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetUint8(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setUint8', this]); |
+ } |
+ %DataViewSetUint8(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetInt16(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getInt16', this]); |
+ } |
+ return %DataViewGetInt16(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetInt16(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setInt16', this]); |
+ } |
+ %DataViewSetInt16(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetUint16(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getUint16', this]); |
+ } |
+ return %DataViewGetUint16(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetUint16(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setUint16', this]); |
+ } |
+ %DataViewSetUint16(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetInt32(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getInt32', this]); |
+ } |
+ return %DataViewGetInt32(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetInt32(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setInt32', this]); |
+ } |
+ %DataViewSetInt32(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetUint32(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getUint32', this]); |
+ } |
+ return %DataViewGetUint32(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetUint32(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setUint32', this]); |
+ } |
+ %DataViewSetUint32(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetFloat32(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getFloat32', this]); |
+ } |
+ return %DataViewGetFloat32(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetFloat32(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setFloat32', this]); |
+ } |
+ %DataViewSetFloat32(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(value), |
+ !!little_endian); |
+} |
+ |
+function DataViewGetFloat64(offset, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.getFloat64', this]); |
+ } |
+ return %DataViewGetFloat64(this, TO_POSITIVE_INTEGER(offset), !!little_endian); |
+} |
+ |
+function DataViewSetFloat64(offset, value, little_endian) { |
+ if (!IS_DATAVIEW(this)) { |
+ throw MakeTypeError('incompatible_method_reciever', |
+ ['DataView.setFloat64', this]); |
+ } |
+ %DataViewSetFloat64(this, |
+ TO_POSITIVE_INTEGER(offset), |
+ TO_NUMBER_INLINE(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(); |