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