| 'use strict'; |
| var $ = require('../internals/export'); |
| var uncurryThis = require('../internals/function-uncurry-this-clause'); |
| var fails = require('../internals/fails'); |
| var ArrayBufferModule = require('../internals/array-buffer'); |
| var anObject = require('../internals/an-object'); |
| var toAbsoluteIndex = require('../internals/to-absolute-index'); |
| var toLength = require('../internals/to-length'); |
|
|
| var ArrayBuffer = ArrayBufferModule.ArrayBuffer; |
| var DataView = ArrayBufferModule.DataView; |
| var DataViewPrototype = DataView.prototype; |
| var nativeArrayBufferSlice = uncurryThis(ArrayBuffer.prototype.slice); |
| var getUint8 = uncurryThis(DataViewPrototype.getUint8); |
| var setUint8 = uncurryThis(DataViewPrototype.setUint8); |
|
|
| var INCORRECT_SLICE = fails(function () { |
| return !new ArrayBuffer(2).slice(1, undefined).byteLength; |
| }); |
|
|
| |
| |
| $({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, { |
| slice: function slice(start, end) { |
| if (nativeArrayBufferSlice && end === undefined) { |
| return nativeArrayBufferSlice(anObject(this), start); |
| } |
| var length = anObject(this).byteLength; |
| var first = toAbsoluteIndex(start, length); |
| var fin = toAbsoluteIndex(end === undefined ? length : end, length); |
| var result = new ArrayBuffer(toLength(fin - first)); |
| var viewSource = new DataView(this); |
| var viewTarget = new DataView(result); |
| var index = 0; |
| while (first < fin) { |
| setUint8(viewTarget, index++, getUint8(viewSource, first++)); |
| } return result; |
| } |
| }); |
|
|