arraybuffer.js revision 014dc512cdd3e367bee49a713fdc5ed92584a3e5
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 MakeTypeError; 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar MaxSimple; 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar MinSimple; 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar SpeciesConstructor; 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochutils.Import(function(from) { 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MakeTypeError = from.MakeTypeError; 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaxSimple = from.MaxSimple; 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MinSimple = from.MinSimple; 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SpeciesConstructor = from.SpeciesConstructor; 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}); 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ------------------------------------------------------------------- 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction ArrayBufferGetByteLen() { 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_ARRAYBUFFER(this)) { 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch throw MakeTypeError(kIncompatibleMethodReceiver, 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'ArrayBuffer.prototype.byteLength', this); 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return %_ArrayBufferGetByteLength(this); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 Draft 15.13.5.5.3 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction ArrayBufferSlice(start, end) { 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_ARRAYBUFFER(this)) { 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch throw MakeTypeError(kIncompatibleMethodReceiver, 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'ArrayBuffer.prototype.slice', this); 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var relativeStart = TO_INTEGER(start); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_UNDEFINED(end)) { 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch end = TO_INTEGER(end); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var first; 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var byte_length = %_ArrayBufferGetByteLength(this); 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (relativeStart < 0) { 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch first = MaxSimple(byte_length + relativeStart, 0); 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch first = MinSimple(relativeStart, byte_length); 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var relativeEnd = IS_UNDEFINED(end) ? byte_length : end; 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var fin; 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (relativeEnd < 0) { 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = MaxSimple(byte_length + relativeEnd, 0); 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = MinSimple(relativeEnd, byte_length); 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (fin < first) { 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch fin = first; 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var newLen = fin - first; 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var constructor = SpeciesConstructor(this, GlobalArrayBuffer, true); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var result = new constructor(newLen); 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IS_ARRAYBUFFER(result)) { 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch throw MakeTypeError(kIncompatibleMethodReceiver, 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 'ArrayBuffer.prototype.slice', result); 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(littledan): Check for a detached ArrayBuffer 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (result === this) { 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch throw MakeTypeError(kArrayBufferSpeciesThis); 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (%_ArrayBufferGetByteLength(result) < newLen) { 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch throw MakeTypeError(kArrayBufferTooShort); 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch %ArrayBufferSliceImpl(this, result, first, newLen); 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochutils.InstallGetter(GlobalArrayBuffer.prototype, "byteLength", 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ArrayBufferGetByteLen); 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochutils.InstallFunctions(GlobalArrayBuffer.prototype, DONT_ENUM, [ 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "slice", ArrayBufferSlice 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch]); 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}) 93