37aa10358b44e3296c7585e76a833911dc2d35c6cdc8a0698ef5d4227cf9c260aad1ea160bdf1e2814f1db755a9921032f54ca495ba78edf7cd0c4d043fe69 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. 'use strict';
  2. var global = require('./_global');
  3. var DESCRIPTORS = require('./_descriptors');
  4. var LIBRARY = require('./_library');
  5. var $typed = require('./_typed');
  6. var hide = require('./_hide');
  7. var redefineAll = require('./_redefine-all');
  8. var fails = require('./_fails');
  9. var anInstance = require('./_an-instance');
  10. var toInteger = require('./_to-integer');
  11. var toLength = require('./_to-length');
  12. var toIndex = require('./_to-index');
  13. var gOPN = require('./_object-gopn').f;
  14. var dP = require('./_object-dp').f;
  15. var arrayFill = require('./_array-fill');
  16. var setToStringTag = require('./_set-to-string-tag');
  17. var ARRAY_BUFFER = 'ArrayBuffer';
  18. var DATA_VIEW = 'DataView';
  19. var PROTOTYPE = 'prototype';
  20. var WRONG_LENGTH = 'Wrong length!';
  21. var WRONG_INDEX = 'Wrong index!';
  22. var $ArrayBuffer = global[ARRAY_BUFFER];
  23. var $DataView = global[DATA_VIEW];
  24. var Math = global.Math;
  25. var RangeError = global.RangeError;
  26. // eslint-disable-next-line no-shadow-restricted-names
  27. var Infinity = global.Infinity;
  28. var BaseBuffer = $ArrayBuffer;
  29. var abs = Math.abs;
  30. var pow = Math.pow;
  31. var floor = Math.floor;
  32. var log = Math.log;
  33. var LN2 = Math.LN2;
  34. var BUFFER = 'buffer';
  35. var BYTE_LENGTH = 'byteLength';
  36. var BYTE_OFFSET = 'byteOffset';
  37. var $BUFFER = DESCRIPTORS ? '_b' : BUFFER;
  38. var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;
  39. var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;
  40. // IEEE754 conversions based on https://github.com/feross/ieee754
  41. function packIEEE754(value, mLen, nBytes) {
  42. var buffer = new Array(nBytes);
  43. var eLen = nBytes * 8 - mLen - 1;
  44. var eMax = (1 << eLen) - 1;
  45. var eBias = eMax >> 1;
  46. var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
  47. var i = 0;
  48. var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
  49. var e, m, c;
  50. value = abs(value);
  51. // eslint-disable-next-line no-self-compare
  52. if (value != value || value === Infinity) {
  53. // eslint-disable-next-line no-self-compare
  54. m = value != value ? 1 : 0;
  55. e = eMax;
  56. } else {
  57. e = floor(log(value) / LN2);
  58. if (value * (c = pow(2, -e)) < 1) {
  59. e--;
  60. c *= 2;
  61. }
  62. if (e + eBias >= 1) {
  63. value += rt / c;
  64. } else {
  65. value += rt * pow(2, 1 - eBias);
  66. }
  67. if (value * c >= 2) {
  68. e++;
  69. c /= 2;
  70. }
  71. if (e + eBias >= eMax) {
  72. m = 0;
  73. e = eMax;
  74. } else if (e + eBias >= 1) {
  75. m = (value * c - 1) * pow(2, mLen);
  76. e = e + eBias;
  77. } else {
  78. m = value * pow(2, eBias - 1) * pow(2, mLen);
  79. e = 0;
  80. }
  81. }
  82. for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);
  83. e = e << mLen | m;
  84. eLen += mLen;
  85. for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);
  86. buffer[--i] |= s * 128;
  87. return buffer;
  88. }
  89. function unpackIEEE754(buffer, mLen, nBytes) {
  90. var eLen = nBytes * 8 - mLen - 1;
  91. var eMax = (1 << eLen) - 1;
  92. var eBias = eMax >> 1;
  93. var nBits = eLen - 7;
  94. var i = nBytes - 1;
  95. var s = buffer[i--];
  96. var e = s & 127;
  97. var m;
  98. s >>= 7;
  99. for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);
  100. m = e & (1 << -nBits) - 1;
  101. e >>= -nBits;
  102. nBits += mLen;
  103. for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);
  104. if (e === 0) {
  105. e = 1 - eBias;
  106. } else if (e === eMax) {
  107. return m ? NaN : s ? -Infinity : Infinity;
  108. } else {
  109. m = m + pow(2, mLen);
  110. e = e - eBias;
  111. } return (s ? -1 : 1) * m * pow(2, e - mLen);
  112. }
  113. function unpackI32(bytes) {
  114. return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
  115. }
  116. function packI8(it) {
  117. return [it & 0xff];
  118. }
  119. function packI16(it) {
  120. return [it & 0xff, it >> 8 & 0xff];
  121. }
  122. function packI32(it) {
  123. return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
  124. }
  125. function packF64(it) {
  126. return packIEEE754(it, 52, 8);
  127. }
  128. function packF32(it) {
  129. return packIEEE754(it, 23, 4);
  130. }
  131. function addGetter(C, key, internal) {
  132. dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });
  133. }
  134. function get(view, bytes, index, isLittleEndian) {
  135. var numIndex = +index;
  136. var intIndex = toIndex(numIndex);
  137. if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
  138. var store = view[$BUFFER]._b;
  139. var start = intIndex + view[$OFFSET];
  140. var pack = store.slice(start, start + bytes);
  141. return isLittleEndian ? pack : pack.reverse();
  142. }
  143. function set(view, bytes, index, conversion, value, isLittleEndian) {
  144. var numIndex = +index;
  145. var intIndex = toIndex(numIndex);
  146. if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
  147. var store = view[$BUFFER]._b;
  148. var start = intIndex + view[$OFFSET];
  149. var pack = conversion(+value);
  150. for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
  151. }
  152. if (!$typed.ABV) {
  153. $ArrayBuffer = function ArrayBuffer(length) {
  154. anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
  155. var byteLength = toIndex(length);
  156. this._b = arrayFill.call(new Array(byteLength), 0);
  157. this[$LENGTH] = byteLength;
  158. };
  159. $DataView = function DataView(buffer, byteOffset, byteLength) {
  160. anInstance(this, $DataView, DATA_VIEW);
  161. anInstance(buffer, $ArrayBuffer, DATA_VIEW);
  162. var bufferLength = buffer[$LENGTH];
  163. var offset = toInteger(byteOffset);
  164. if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
  165. byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
  166. if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
  167. this[$BUFFER] = buffer;
  168. this[$OFFSET] = offset;
  169. this[$LENGTH] = byteLength;
  170. };
  171. if (DESCRIPTORS) {
  172. addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
  173. addGetter($DataView, BUFFER, '_b');
  174. addGetter($DataView, BYTE_LENGTH, '_l');
  175. addGetter($DataView, BYTE_OFFSET, '_o');
  176. }
  177. redefineAll($DataView[PROTOTYPE], {
  178. getInt8: function getInt8(byteOffset) {
  179. return get(this, 1, byteOffset)[0] << 24 >> 24;
  180. },
  181. getUint8: function getUint8(byteOffset) {
  182. return get(this, 1, byteOffset)[0];
  183. },
  184. getInt16: function getInt16(byteOffset /* , littleEndian */) {
  185. var bytes = get(this, 2, byteOffset, arguments[1]);
  186. return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
  187. },
  188. getUint16: function getUint16(byteOffset /* , littleEndian */) {
  189. var bytes = get(this, 2, byteOffset, arguments[1]);
  190. return bytes[1] << 8 | bytes[0];
  191. },
  192. getInt32: function getInt32(byteOffset /* , littleEndian */) {
  193. return unpackI32(get(this, 4, byteOffset, arguments[1]));
  194. },
  195. getUint32: function getUint32(byteOffset /* , littleEndian */) {
  196. return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
  197. },
  198. getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
  199. return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
  200. },
  201. getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
  202. return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
  203. },
  204. setInt8: function setInt8(byteOffset, value) {
  205. set(this, 1, byteOffset, packI8, value);
  206. },
  207. setUint8: function setUint8(byteOffset, value) {
  208. set(this, 1, byteOffset, packI8, value);
  209. },
  210. setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
  211. set(this, 2, byteOffset, packI16, value, arguments[2]);
  212. },
  213. setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
  214. set(this, 2, byteOffset, packI16, value, arguments[2]);
  215. },
  216. setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
  217. set(this, 4, byteOffset, packI32, value, arguments[2]);
  218. },
  219. setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
  220. set(this, 4, byteOffset, packI32, value, arguments[2]);
  221. },
  222. setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
  223. set(this, 4, byteOffset, packF32, value, arguments[2]);
  224. },
  225. setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
  226. set(this, 8, byteOffset, packF64, value, arguments[2]);
  227. }
  228. });
  229. } else {
  230. if (!fails(function () {
  231. $ArrayBuffer(1);
  232. }) || !fails(function () {
  233. new $ArrayBuffer(-1); // eslint-disable-line no-new
  234. }) || fails(function () {
  235. new $ArrayBuffer(); // eslint-disable-line no-new
  236. new $ArrayBuffer(1.5); // eslint-disable-line no-new
  237. new $ArrayBuffer(NaN); // eslint-disable-line no-new
  238. return $ArrayBuffer.name != ARRAY_BUFFER;
  239. })) {
  240. $ArrayBuffer = function ArrayBuffer(length) {
  241. anInstance(this, $ArrayBuffer);
  242. return new BaseBuffer(toIndex(length));
  243. };
  244. var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
  245. for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
  246. if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);
  247. }
  248. if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;
  249. }
  250. // iOS Safari 7.x bug
  251. var view = new $DataView(new $ArrayBuffer(2));
  252. var $setInt8 = $DataView[PROTOTYPE].setInt8;
  253. view.setInt8(0, 2147483648);
  254. view.setInt8(1, 2147483649);
  255. if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {
  256. setInt8: function setInt8(byteOffset, value) {
  257. $setInt8.call(this, byteOffset, value << 24 >> 24);
  258. },
  259. setUint8: function setUint8(byteOffset, value) {
  260. $setInt8.call(this, byteOffset, value << 24 >> 24);
  261. }
  262. }, true);
  263. }
  264. setToStringTag($ArrayBuffer, ARRAY_BUFFER);
  265. setToStringTag($DataView, DATA_VIEW);
  266. hide($DataView[PROTOTYPE], $typed.VIEW, true);
  267. exports[ARRAY_BUFFER] = $ArrayBuffer;
  268. exports[DATA_VIEW] = $DataView;