| | |
| | | 'use strict'; |
| | | var global = require('../internals/global'); |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var DESCRIPTORS = require('../internals/descriptors'); |
| | | var NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native'); |
| | | var FunctionName = require('../internals/function-name'); |
| | | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); |
| | | var redefineAll = require('../internals/redefine-all'); |
| | | var defineBuiltIns = require('../internals/define-built-ins'); |
| | | var fails = require('../internals/fails'); |
| | | var anInstance = require('../internals/an-instance'); |
| | | var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); |
| | |
| | | var getOwnPropertyNames = require('../internals/object-get-own-property-names').f; |
| | | var defineProperty = require('../internals/object-define-property').f; |
| | | var arrayFill = require('../internals/array-fill'); |
| | | var arraySlice = require('../internals/array-slice-simple'); |
| | | var setToStringTag = require('../internals/set-to-string-tag'); |
| | | var InternalStateModule = require('../internals/internal-state'); |
| | | |
| | |
| | | var WRONG_INDEX = 'Wrong index'; |
| | | var NativeArrayBuffer = global[ARRAY_BUFFER]; |
| | | var $ArrayBuffer = NativeArrayBuffer; |
| | | var ArrayBufferPrototype = $ArrayBuffer && $ArrayBuffer[PROTOTYPE]; |
| | | var $DataView = global[DATA_VIEW]; |
| | | var $DataViewPrototype = $DataView && $DataView[PROTOTYPE]; |
| | | var DataViewPrototype = $DataView && $DataView[PROTOTYPE]; |
| | | var ObjectPrototype = Object.prototype; |
| | | var Array = global.Array; |
| | | var RangeError = global.RangeError; |
| | | var fill = uncurryThis(arrayFill); |
| | | var reverse = uncurryThis([].reverse); |
| | | |
| | | var packIEEE754 = IEEE754.pack; |
| | | var unpackIEEE754 = IEEE754.unpack; |
| | |
| | | if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX); |
| | | var bytes = getInternalState(store.buffer).bytes; |
| | | var start = intIndex + store.byteOffset; |
| | | var pack = bytes.slice(start, start + count); |
| | | return isLittleEndian ? pack : pack.reverse(); |
| | | var pack = arraySlice(bytes, start, start + count); |
| | | return isLittleEndian ? pack : reverse(pack); |
| | | }; |
| | | |
| | | var set = function (view, count, index, conversion, value, isLittleEndian) { |
| | |
| | | |
| | | if (!NATIVE_ARRAY_BUFFER) { |
| | | $ArrayBuffer = function ArrayBuffer(length) { |
| | | anInstance(this, $ArrayBuffer, ARRAY_BUFFER); |
| | | anInstance(this, ArrayBufferPrototype); |
| | | var byteLength = toIndex(length); |
| | | setInternalState(this, { |
| | | bytes: arrayFill.call(new Array(byteLength), 0), |
| | | bytes: fill(Array(byteLength), 0), |
| | | byteLength: byteLength |
| | | }); |
| | | if (!DESCRIPTORS) this.byteLength = byteLength; |
| | | }; |
| | | |
| | | ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE]; |
| | | |
| | | $DataView = function DataView(buffer, byteOffset, byteLength) { |
| | | anInstance(this, $DataView, DATA_VIEW); |
| | | anInstance(buffer, $ArrayBuffer, DATA_VIEW); |
| | | anInstance(this, DataViewPrototype); |
| | | anInstance(buffer, ArrayBufferPrototype); |
| | | var bufferLength = getInternalState(buffer).byteLength; |
| | | var offset = toIntegerOrInfinity(byteOffset); |
| | | if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset'); |
| | |
| | | } |
| | | }; |
| | | |
| | | DataViewPrototype = $DataView[PROTOTYPE]; |
| | | |
| | | if (DESCRIPTORS) { |
| | | addGetter($ArrayBuffer, 'byteLength'); |
| | | addGetter($DataView, 'buffer'); |
| | |
| | | addGetter($DataView, 'byteOffset'); |
| | | } |
| | | |
| | | redefineAll($DataView[PROTOTYPE], { |
| | | defineBuiltIns(DataViewPrototype, { |
| | | getInt8: function getInt8(byteOffset) { |
| | | return get(this, 1, byteOffset)[0] << 24 >> 24; |
| | | }, |
| | |
| | | })) { |
| | | /* eslint-enable no-new -- required for testing */ |
| | | $ArrayBuffer = function ArrayBuffer(length) { |
| | | anInstance(this, $ArrayBuffer); |
| | | anInstance(this, ArrayBufferPrototype); |
| | | return new NativeArrayBuffer(toIndex(length)); |
| | | }; |
| | | var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE]; |
| | | |
| | | $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype; |
| | | |
| | | for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) { |
| | | if (!((key = keys[j++]) in $ArrayBuffer)) { |
| | | createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]); |
| | | } |
| | | } |
| | | |
| | | ArrayBufferPrototype.constructor = $ArrayBuffer; |
| | | } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) { |
| | | createNonEnumerableProperty(NativeArrayBuffer, 'name', ARRAY_BUFFER); |
| | | } |
| | | |
| | | // WebKit bug - the same parent prototype for typed arrays and data view |
| | | if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) { |
| | | setPrototypeOf($DataViewPrototype, ObjectPrototype); |
| | | if (setPrototypeOf && getPrototypeOf(DataViewPrototype) !== ObjectPrototype) { |
| | | setPrototypeOf(DataViewPrototype, ObjectPrototype); |
| | | } |
| | | |
| | | // iOS Safari 7.x bug |
| | | var testView = new $DataView(new $ArrayBuffer(2)); |
| | | var $setInt8 = $DataViewPrototype.setInt8; |
| | | var $setInt8 = uncurryThis(DataViewPrototype.setInt8); |
| | | testView.setInt8(0, 2147483648); |
| | | testView.setInt8(1, 2147483649); |
| | | if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, { |
| | | if (testView.getInt8(0) || !testView.getInt8(1)) defineBuiltIns(DataViewPrototype, { |
| | | setInt8: function setInt8(byteOffset, value) { |
| | | $setInt8.call(this, byteOffset, value << 24 >> 24); |
| | | $setInt8(this, byteOffset, value << 24 >> 24); |
| | | }, |
| | | setUint8: function setUint8(byteOffset, value) { |
| | | $setInt8.call(this, byteOffset, value << 24 >> 24); |
| | | $setInt8(this, byteOffset, value << 24 >> 24); |
| | | } |
| | | }, { unsafe: true }); |
| | | } |