1// Copyright 2013 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5(function(global, utils) { 6 7"use strict"; 8 9%CheckIsBootstrapping(); 10 11// ------------------------------------------------------------------- 12// Imports 13 14var GlobalArrayBuffer = global.ArrayBuffer; 15var MakeTypeError; 16var MaxSimple; 17var MinSimple; 18var SpeciesConstructor; 19var speciesSymbol = utils.ImportNow("species_symbol"); 20 21utils.Import(function(from) { 22 MakeTypeError = from.MakeTypeError; 23 MaxSimple = from.MaxSimple; 24 MinSimple = from.MinSimple; 25 SpeciesConstructor = from.SpeciesConstructor; 26}); 27 28// ------------------------------------------------------------------- 29 30function ArrayBufferGetByteLen() { 31 if (!IS_ARRAYBUFFER(this)) { 32 throw MakeTypeError(kIncompatibleMethodReceiver, 33 'ArrayBuffer.prototype.byteLength', this); 34 } 35 return %_ArrayBufferGetByteLength(this); 36} 37 38// ES6 Draft 15.13.5.5.3 39function ArrayBufferSlice(start, end) { 40 if (!IS_ARRAYBUFFER(this)) { 41 throw MakeTypeError(kIncompatibleMethodReceiver, 42 'ArrayBuffer.prototype.slice', this); 43 } 44 45 var relativeStart = TO_INTEGER(start); 46 if (!IS_UNDEFINED(end)) { 47 end = TO_INTEGER(end); 48 } 49 var first; 50 var byte_length = %_ArrayBufferGetByteLength(this); 51 if (relativeStart < 0) { 52 first = MaxSimple(byte_length + relativeStart, 0); 53 } else { 54 first = MinSimple(relativeStart, byte_length); 55 } 56 var relativeEnd = IS_UNDEFINED(end) ? byte_length : end; 57 var fin; 58 if (relativeEnd < 0) { 59 fin = MaxSimple(byte_length + relativeEnd, 0); 60 } else { 61 fin = MinSimple(relativeEnd, byte_length); 62 } 63 64 if (fin < first) { 65 fin = first; 66 } 67 var newLen = fin - first; 68 var constructor = SpeciesConstructor(this, GlobalArrayBuffer, true); 69 var result = new constructor(newLen); 70 if (!IS_ARRAYBUFFER(result)) { 71 throw MakeTypeError(kIncompatibleMethodReceiver, 72 'ArrayBuffer.prototype.slice', result); 73 } 74 // Checks for detached source/target ArrayBuffers are done inside of 75 // %ArrayBufferSliceImpl; the reordering of checks does not violate 76 // the spec because all exceptions thrown are TypeErrors. 77 if (result === this) { 78 throw MakeTypeError(kArrayBufferSpeciesThis); 79 } 80 if (%_ArrayBufferGetByteLength(result) < newLen) { 81 throw MakeTypeError(kArrayBufferTooShort); 82 } 83 84 %ArrayBufferSliceImpl(this, result, first, newLen); 85 return result; 86} 87 88 89function ArrayBufferSpecies() { 90 return this; 91} 92 93utils.InstallGetter(GlobalArrayBuffer, speciesSymbol, ArrayBufferSpecies); 94 95utils.InstallGetter(GlobalArrayBuffer.prototype, "byteLength", 96 ArrayBufferGetByteLen); 97 98utils.InstallFunctions(GlobalArrayBuffer.prototype, DONT_ENUM, [ 99 "slice", ArrayBufferSlice 100]); 101 102}) 103