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