1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"use strict";
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This file relies on the fact that the following declaration has been made
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// in runtime.js:
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// var $Array = global.Array;
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar $ArrayBuffer = global.ArrayBuffer;
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// --------------- Typed Arrays ---------------------
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmacro TYPED_ARRAYS(FUNCTION)
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(1, Uint8Array, 1)
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(2, Int8Array, 1)
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(3, Uint16Array, 2)
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(4, Int16Array, 2)
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(5, Uint32Array, 4)
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(6, Int32Array, 4)
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(7, Float32Array, 4)
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(8, Float64Array, 8)
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFUNCTION(9, Uint8ClampedArray, 1)
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochendmacro
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmacro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(byteOffset)) {
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      byteOffset =
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ToPositiveInteger(byteOffset,  "invalid_typed_array_length");
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(length)) {
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      length = ToPositiveInteger(length, "invalid_typed_array_length");
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var offset;
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(byteOffset)) {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    offset = 0;
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    offset = byteOffset;
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (offset % ELEMENT_SIZE !== 0) {
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeRangeError("invalid_typed_array_alignment",
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["start offset", "NAME", ELEMENT_SIZE]);
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (offset > bufferByteLength) {
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeRangeError("invalid_typed_array_offset");
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var newByteLength;
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var newLength;
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IS_UNDEFINED(length)) {
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (bufferByteLength % ELEMENT_SIZE !== 0) {
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeRangeError("invalid_typed_array_alignment",
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ["byte length", "NAME", ELEMENT_SIZE]);
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    newByteLength = bufferByteLength - offset;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    newLength = newByteLength / ELEMENT_SIZE;
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var newLength = length;
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    newByteLength = newLength * ELEMENT_SIZE;
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((offset + newByteLength > bufferByteLength)
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      || (newLength > %_MaxSmi())) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeRangeError("invalid_typed_array_length");
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAMEConstructByLength(obj, length) {
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var l = IS_UNDEFINED(length) ?
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    0 : ToPositiveInteger(length, "invalid_typed_array_length");
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (l > %_MaxSmi()) {
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeRangeError("invalid_typed_array_length");
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var byteLength = l * ELEMENT_SIZE;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (byteLength > %_TypedArrayMaxSizeInHeap()) {
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var buffer = new $ArrayBuffer(byteLength);
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAMEConstructByArrayLike(obj, arrayLike) {
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var length = arrayLike.length;
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var l = ToPositiveInteger(length, "invalid_typed_array_length");
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (l > %_MaxSmi()) {
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeRangeError("invalid_typed_array_length");
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < l; i++) {
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // It is crucial that we let any execptions from arrayLike[i]
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // propagate outside the function.
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      obj[i] = arrayLike[i];
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAMEConstructor(arg1, arg2, arg3) {
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%_IsConstructCall()) {
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IS_ARRAYBUFFER(arg1)) {
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NAMEConstructByLength(this, arg1);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NAMEConstructByArrayLike(this, arg1);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError("constructor_not_function", ["NAME"])
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAME_GetBuffer() {
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(%_ClassOf(this) === 'NAME')) {
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ["NAME.buffer", this]);
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %TypedArrayGetBuffer(this);
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAME_GetByteLength() {
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(%_ClassOf(this) === 'NAME')) {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ["NAME.byteLength", this]);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_ArrayBufferViewGetByteLength(this);
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAME_GetByteOffset() {
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(%_ClassOf(this) === 'NAME')) {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ["NAME.byteOffset", this]);
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_ArrayBufferViewGetByteOffset(this);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAME_GetLength() {
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(%_ClassOf(this) === 'NAME')) {
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ["NAME.length", this]);
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_TypedArrayGetLength(this);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar $NAME = global.NAME;
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NAMESubArray(begin, end) {
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(%_ClassOf(this) === 'NAME')) {
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ["NAME.subarray", this]);
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var beginInt = TO_INTEGER(begin);
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_UNDEFINED(end)) {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    end = TO_INTEGER(end);
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var srcLength = %_TypedArrayGetLength(this);
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (beginInt < 0) {
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    beginInt = MathMax(0, srcLength + beginInt);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    beginInt = MathMin(srcLength, beginInt);
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var endInt = IS_UNDEFINED(end) ? srcLength : end;
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (endInt < 0) {
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    endInt = MathMax(0, srcLength + endInt);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    endInt = MathMin(endInt, srcLength);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (endInt < beginInt) {
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    endInt = beginInt;
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var newLength = endInt - beginInt;
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var beginByteOffset =
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new $NAME(%TypedArrayGetBuffer(this),
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   beginByteOffset, newLength);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochendmacro
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TypedArraySetFromArrayLike(target, source, sourceLength, offset) {
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (offset > 0) {
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < sourceLength; i++) {
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      target[offset + i] = source[i];
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  else {
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i = 0; i < sourceLength; i++) {
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      target[i] = source[i];
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TypedArraySetFromOverlappingTypedArray(target, source, offset) {
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var sourceElementSize = source.BYTES_PER_ELEMENT;
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var targetElementSize = target.BYTES_PER_ELEMENT;
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var sourceLength = source.length;
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Copy left part.
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function CopyLeftPart() {
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // First un-mutated byte after the next write
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var targetPtr = target.byteOffset + (offset + 1) * targetElementSize;
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Next read at sourcePtr. We do not care for memory changing before
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // sourcePtr - we have already copied it.
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var sourcePtr = source.byteOffset;
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var leftIndex = 0;
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         leftIndex < sourceLength && targetPtr <= sourcePtr;
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         leftIndex++) {
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      target[offset + leftIndex] = source[leftIndex];
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      targetPtr += targetElementSize;
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sourcePtr += sourceElementSize;
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return leftIndex;
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var leftIndex = CopyLeftPart();
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Copy rigth part;
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function CopyRightPart() {
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // First unmutated byte before the next write
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var targetPtr =
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      target.byteOffset + (offset + sourceLength - 1) * targetElementSize;
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Next read before sourcePtr. We do not care for memory changing after
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // sourcePtr - we have already copied it.
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var sourcePtr =
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      source.byteOffset + sourceLength * sourceElementSize;
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for(var rightIndex = sourceLength - 1;
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        rightIndex >= leftIndex && targetPtr >= sourcePtr;
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        rightIndex--) {
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      target[offset + rightIndex] = source[rightIndex];
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      targetPtr -= targetElementSize;
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sourcePtr -= sourceElementSize;
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return rightIndex;
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var rightIndex = CopyRightPart();
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var temp = new $Array(rightIndex + 1 - leftIndex);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = leftIndex; i <= rightIndex; i++) {
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temp[i - leftIndex] = source[i];
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (i = leftIndex; i <= rightIndex; i++) {
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    target[offset + i] = temp[i - leftIndex];
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TypedArraySet(obj, offset) {
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (intOffset < 0) {
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError("typed_array_set_negative_offset");
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (intOffset > %_MaxSmi()) {
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeRangeError("typed_array_set_source_too_large");
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (%TypedArraySetFastCases(this, obj, intOffset)) {
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // These numbers should be synchronized with runtime.cc.
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TypedArraySetFromOverlappingTypedArray(this, obj, intOffset);
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TypedArraySetFromArrayLike(this, obj, obj.length, intOffset);
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var l = obj.length;
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (IS_UNDEFINED(l)) {
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (IS_NUMBER(obj)) {
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            // For number as a first argument, throw TypeError
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            // instead of silently ignoring the call, so that
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            // the user knows (s)he did something wrong.
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            // (Consistent with Firefox and Blink/WebKit)
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            throw MakeTypeError("invalid_argument");
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return;
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (intOffset + l > this.length) {
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        throw MakeRangeError("typed_array_set_source_too_large");
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TypedArraySetFromArrayLike(this, obj, l, intOffset);
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -------------------------------------------------------------------
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetupTypedArrays() {
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmacro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE)
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %CheckIsBootstrapping();
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %SetCode(global.NAME, NAMEConstructor);
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetPrototype(global.NAME, new $Object());
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty(global.NAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE,
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    READ_ONLY | DONT_ENUM | DONT_DELETE);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty(global.NAME.prototype,
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    "constructor", global.NAME, DONT_ENUM);
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty(global.NAME.prototype,
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    "BYTES_PER_ELEMENT", ELEMENT_SIZE,
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    READ_ONLY | DONT_ENUM | DONT_DELETE);
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter(global.NAME.prototype, "buffer", NAME_GetBuffer);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter(global.NAME.prototype, "byteOffset", NAME_GetByteOffset);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter(global.NAME.prototype, "byteLength", NAME_GetByteLength);
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter(global.NAME.prototype, "length", NAME_GetLength);
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallFunctions(global.NAME.prototype, DONT_ENUM, $Array(
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        "subarray", NAMESubArray,
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        "set", TypedArraySet
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ));
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochendmacro
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(SETUP_TYPED_ARRAY)
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSetupTypedArrays();
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// --------------------------- DataView -----------------------------
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar $DataView = global.DataView;
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%_IsConstructCall()) {
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_ARRAYBUFFER(buffer)) {
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeTypeError('data_view_not_array_buffer', []);
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_UNDEFINED(byteOffset)) {
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset');
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IS_UNDEFINED(byteLength)) {
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        byteLength = TO_INTEGER(byteLength);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var offset = IS_UNDEFINED(byteOffset) ?  0 : byteOffset;
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (offset > bufferByteLength) {
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw MakeRangeError('invalid_data_view_offset');
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var length = IS_UNDEFINED(byteLength)
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? bufferByteLength - offset
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : byteLength;
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (length < 0 || offset + length > bufferByteLength) {
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw new MakeRangeError('invalid_data_view_length');
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    %_DataViewInitialize(this, buffer, offset, length);
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('constructor_not_function', ["DataView"]);
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewGetBufferJS() {
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_DATAVIEW(this)) {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['DataView.buffer', this]);
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %DataViewGetBuffer(this);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewGetByteOffset() {
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_DATAVIEW(this)) {
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['DataView.byteOffset', this]);
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_ArrayBufferViewGetByteOffset(this);
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewGetByteLength() {
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_DATAVIEW(this)) {
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['DataView.byteLength', this]);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %_ArrayBufferViewGetByteLength(this);
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmacro DATA_VIEW_TYPES(FUNCTION)
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Int8)
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Uint8)
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Int16)
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Uint16)
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Int32)
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Uint32)
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Float32)
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FUNCTION(Float64)
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochendmacro
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ToPositiveDataViewOffset(offset) {
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset');
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochmacro DATA_VIEW_GETTER_SETTER(TYPENAME)
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewGetTYPENAMEJS(offset, little_endian) {
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_DATAVIEW(this)) {
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['DataView.getTYPENAME', this]);
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%_ArgumentsLength() < 1) {
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('invalid_argument');
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return %DataViewGetTYPENAME(this,
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          ToPositiveDataViewOffset(offset),
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          !!little_endian);
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction DataViewSetTYPENAMEJS(offset, value, little_endian) {
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IS_DATAVIEW(this)) {
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('incompatible_method_receiver',
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ['DataView.setTYPENAME', this]);
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (%_ArgumentsLength() < 2) {
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    throw MakeTypeError('invalid_argument');
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %DataViewSetTYPENAME(this,
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   ToPositiveDataViewOffset(offset),
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   TO_NUMBER_INLINE(value),
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   !!little_endian);
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochendmacro
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochDATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER)
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SetupDataView() {
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %CheckIsBootstrapping();
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Setup the DataView constructor.
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %SetCode($DataView, DataViewConstructor);
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %FunctionSetPrototype($DataView, new $Object);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set up constructor property on the DataView prototype.
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  %AddNamedProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM);
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS);
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset);
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength);
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstallFunctions($DataView.prototype, DONT_ENUM, $Array(
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getInt8", DataViewGetInt8JS,
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setInt8", DataViewSetInt8JS,
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getUint8", DataViewGetUint8JS,
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setUint8", DataViewSetUint8JS,
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getInt16", DataViewGetInt16JS,
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setInt16", DataViewSetInt16JS,
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getUint16", DataViewGetUint16JS,
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setUint16", DataViewSetUint16JS,
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getInt32", DataViewGetInt32JS,
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setInt32", DataViewSetInt32JS,
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getUint32", DataViewGetUint32JS,
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setUint32", DataViewSetUint32JS,
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getFloat32", DataViewGetFloat32JS,
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setFloat32", DataViewSetFloat32JS,
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "getFloat64", DataViewGetFloat64JS,
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "setFloat64", DataViewSetFloat64JS
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ));
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSetupDataView();
473