You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.7 KiB
40 lines
1.7 KiB
'use strict'; |
|
var $ = require('../internals/export'); |
|
var uncurryThis = require('../internals/function-uncurry-this'); |
|
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 speciesConstructor = require('../internals/species-constructor'); |
|
|
|
var ArrayBuffer = ArrayBufferModule.ArrayBuffer; |
|
var DataView = ArrayBufferModule.DataView; |
|
var DataViewPrototype = DataView.prototype; |
|
var un$ArrayBufferSlice = 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; |
|
}); |
|
|
|
// `ArrayBuffer.prototype.slice` method |
|
// https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice |
|
$({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, { |
|
slice: function slice(start, end) { |
|
if (un$ArrayBufferSlice && end === undefined) { |
|
return un$ArrayBufferSlice(anObject(this), start); // FF fix |
|
} |
|
var length = anObject(this).byteLength; |
|
var first = toAbsoluteIndex(start, length); |
|
var fin = toAbsoluteIndex(end === undefined ? length : end, length); |
|
var result = new (speciesConstructor(this, 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; |
|
} |
|
});
|
|
|