1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch(function(global, utils) { 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"use strict"; 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch%CheckIsBootstrapping(); 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ------------------------------------------------------------------- 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Imports 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar GlobalArrayBuffer = global.ArrayBuffer; 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar MaxSimple; 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar MinSimple; 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar SpeciesConstructor; 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochutils.Import(function(from) { 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaxSimple = from.MaxSimple; 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MinSimple = from.MinSimple; 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SpeciesConstructor = from.SpeciesConstructor; 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}); 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ------------------------------------------------------------------- 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 Draft 15.13.5.5.3 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction ArrayBufferSlice(start, end) { 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_ARRAYBUFFER(this)) { 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw %make_type_error(kIncompatibleMethodReceiver, 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'ArrayBuffer.prototype.slice', this); 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var relativeStart = TO_INTEGER(start); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_UNDEFINED(end)) { 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch end = TO_INTEGER(end); 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var first; 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var byte_length = %_ArrayBufferGetByteLength(this); 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (relativeStart < 0) { 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch first = MaxSimple(byte_length + relativeStart, 0); 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch first = MinSimple(relativeStart, byte_length); 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var relativeEnd = IS_UNDEFINED(end) ? byte_length : end; 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var fin; 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (relativeEnd < 0) { 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = MaxSimple(byte_length + relativeEnd, 0); 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = MinSimple(relativeEnd, byte_length); 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (fin < first) { 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = first; 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var newLen = fin - first; 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var constructor = SpeciesConstructor(this, GlobalArrayBuffer, true); 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var result = new constructor(newLen); 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_ARRAYBUFFER(result)) { 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw %make_type_error(kIncompatibleMethodReceiver, 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'ArrayBuffer.prototype.slice', result); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Checks for detached source/target ArrayBuffers are done inside of 64bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // %ArrayBufferSliceImpl; the reordering of checks does not violate 65bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the spec because all exceptions thrown are TypeErrors. 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (result === this) { 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw %make_type_error(kArrayBufferSpeciesThis); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (%_ArrayBufferGetByteLength(result) < newLen) { 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch throw %make_type_error(kArrayBufferTooShort); 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch %ArrayBufferSliceImpl(this, result, first, newLen); 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochutils.InstallFunctions(GlobalArrayBuffer.prototype, DONT_ENUM, [ 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "slice", ArrayBufferSlice 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch]); 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}) 82