1f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
5f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org"use strict";
6f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
7e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// This file relies on the fact that the following declaration has been made
8e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// in runtime.js:
9e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// var $Array = global.Array;
10b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvar $ArrayBuffer = global.ArrayBuffer;
11f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
12f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
13e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// --------------- Typed Arrays ---------------------
14057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgmacro TYPED_ARRAYS(FUNCTION)
15057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org// arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
16057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(1, Uint8Array, 1)
17057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(2, Int8Array, 1)
18057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(3, Uint16Array, 2)
19057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(4, Int16Array, 2)
20057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(5, Uint32Array, 4)
21057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(6, Int32Array, 4)
22057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(7, Float32Array, 4)
23057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(8, Float64Array, 8)
24057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgFUNCTION(9, Uint8ClampedArray, 1)
25057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgendmacro
26e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
27057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgmacro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
28285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) {
29285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!IS_UNDEFINED(byteOffset)) {
30285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      byteOffset =
31285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org          ToPositiveInteger(byteOffset,  "invalid_typed_array_length");
32285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
33285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!IS_UNDEFINED(length)) {
34285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      length = ToPositiveInteger(length, "invalid_typed_array_length");
35285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
36e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
37285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
38285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var offset;
39285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (IS_UNDEFINED(byteOffset)) {
40285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    offset = 0;
41285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
42285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    offset = byteOffset;
43057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
44285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    if (offset % ELEMENT_SIZE !== 0) {
45285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      throw MakeRangeError("invalid_typed_array_alignment",
46285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org          ["start offset", "NAME", ELEMENT_SIZE]);
47f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    }
48285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    if (offset > bufferByteLength) {
49285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      throw MakeRangeError("invalid_typed_array_offset");
50057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    }
51e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
5257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
53285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var newByteLength;
54285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var newLength;
55285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (IS_UNDEFINED(length)) {
56285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    if (bufferByteLength % ELEMENT_SIZE !== 0) {
57285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      throw MakeRangeError("invalid_typed_array_alignment",
58285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org        ["byte length", "NAME", ELEMENT_SIZE]);
59895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    }
60285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    newByteLength = bufferByteLength - offset;
61285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    newLength = newByteLength / ELEMENT_SIZE;
62285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
63285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    var newLength = length;
64285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    newByteLength = newLength * ELEMENT_SIZE;
65e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
66285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if ((offset + newByteLength > bufferByteLength)
67285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      || (newLength > %_MaxSmi())) {
68285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeRangeError("invalid_typed_array_length");
69285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
70285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
71285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
72e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
73285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAMEConstructByLength(obj, length) {
74285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var l = IS_UNDEFINED(length) ?
75285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    0 : ToPositiveInteger(length, "invalid_typed_array_length");
76285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (l > %_MaxSmi()) {
77285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeRangeError("invalid_typed_array_length");
78285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
79285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var byteLength = l * ELEMENT_SIZE;
80285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (byteLength > %_TypedArrayMaxSizeInHeap()) {
81285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    var buffer = new $ArrayBuffer(byteLength);
82285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
83285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
84285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength);
85285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
86285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
874452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
88285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAMEConstructByArrayLike(obj, arrayLike) {
89285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var length = arrayLike.length;
90285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var l = ToPositiveInteger(length, "invalid_typed_array_length");
91285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org
92285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (l > %_MaxSmi()) {
93285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeRangeError("invalid_typed_array_length");
94285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
95285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
96285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    for (var i = 0; i < l; i++) {
97285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      // It is crucial that we let any execptions from arrayLike[i]
98285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      // propagate outside the function.
99285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      obj[i] = arrayLike[i];
10057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    }
101e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
102285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
103e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
104285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAMEConstructor(arg1, arg2, arg3) {
105285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (%_IsConstructCall()) {
106285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    if (IS_ARRAYBUFFER(arg1)) {
107285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
108285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
109285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org               IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
110285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      NAMEConstructByLength(this, arg1);
111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    } else {
112285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      NAMEConstructByArrayLike(this, arg1);
113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    }
114285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
115285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError("constructor_not_function", ["NAME"])
116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
117285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
118057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
119285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAME_GetBuffer() {
120285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!(%_ClassOf(this) === 'NAME')) {
121285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError('incompatible_method_receiver',
122285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                        ["NAME.buffer", this]);
1232f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
124285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return %TypedArrayGetBuffer(this);
125285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
126e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
127285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAME_GetByteLength() {
128285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!(%_ClassOf(this) === 'NAME')) {
129285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError('incompatible_method_receiver',
130285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                        ["NAME.byteLength", this]);
1312f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
132285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return %_ArrayBufferViewGetByteLength(this);
133285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
135285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAME_GetByteOffset() {
136285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!(%_ClassOf(this) === 'NAME')) {
137285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError('incompatible_method_receiver',
138285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                        ["NAME.byteOffset", this]);
1392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
140285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return %_ArrayBufferViewGetByteOffset(this);
141285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
143285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAME_GetLength() {
144285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!(%_ClassOf(this) === 'NAME')) {
145285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError('incompatible_method_receiver',
146285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                        ["NAME.length", this]);
1472f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
148285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return %_TypedArrayGetLength(this);
149285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
151285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgvar $NAME = global.NAME;
152f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
153285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction NAMESubArray(begin, end) {
154285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!(%_ClassOf(this) === 'NAME')) {
155285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    throw MakeTypeError('incompatible_method_receiver',
156285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                        ["NAME.subarray", this]);
157285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
158285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var beginInt = TO_INTEGER(begin);
159285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (!IS_UNDEFINED(end)) {
160285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    end = TO_INTEGER(end);
161285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
1624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
163285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var srcLength = %_TypedArrayGetLength(this);
164285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (beginInt < 0) {
165285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    beginInt = MathMax(0, srcLength + beginInt);
166285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
167285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    beginInt = MathMin(srcLength, beginInt);
168285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
169f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
170285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var endInt = IS_UNDEFINED(end) ? srcLength : end;
171285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (endInt < 0) {
172285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    endInt = MathMax(0, srcLength + endInt);
173285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  } else {
174285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    endInt = MathMin(endInt, srcLength);
175285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  }
176285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  if (endInt < beginInt) {
177285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    endInt = beginInt;
17857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
179285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var newLength = endInt - beginInt;
180285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var beginByteOffset =
181285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;
182285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return new $NAME(%TypedArrayGetBuffer(this),
183285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org                   beginByteOffset, newLength);
184285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org}
1852f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgendmacro
1862f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
1872f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgTYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
1882f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
189f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
190d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction TypedArraySetFromArrayLike(target, source, sourceLength, offset) {
191d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (offset > 0) {
192d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    for (var i = 0; i < sourceLength; i++) {
193d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      target[offset + i] = source[i];
194d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
195d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
196d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  else {
197d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    for (var i = 0; i < sourceLength; i++) {
198d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      target[i] = source[i];
199d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
200d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
201d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
202d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
203d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction TypedArraySetFromOverlappingTypedArray(target, source, offset) {
204d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var sourceElementSize = source.BYTES_PER_ELEMENT;
205d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var targetElementSize = target.BYTES_PER_ELEMENT;
206d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var sourceLength = source.length;
207d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
208d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Copy left part.
209d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  function CopyLeftPart() {
210d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // First un-mutated byte after the next write
211d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var targetPtr = target.byteOffset + (offset + 1) * targetElementSize;
212d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // Next read at sourcePtr. We do not care for memory changing before
213d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // sourcePtr - we have already copied it.
214d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var sourcePtr = source.byteOffset;
215d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    for (var leftIndex = 0;
216d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org         leftIndex < sourceLength && targetPtr <= sourcePtr;
217d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org         leftIndex++) {
218d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      target[offset + leftIndex] = source[leftIndex];
219d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      targetPtr += targetElementSize;
220d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      sourcePtr += sourceElementSize;
221d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
222d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return leftIndex;
223d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
224d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var leftIndex = CopyLeftPart();
225d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
226d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  // Copy rigth part;
227d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  function CopyRightPart() {
228d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // First unmutated byte before the next write
229d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var targetPtr =
230d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      target.byteOffset + (offset + sourceLength - 1) * targetElementSize;
231d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // Next read before sourcePtr. We do not care for memory changing after
232d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // sourcePtr - we have already copied it.
233d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var sourcePtr =
234d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      source.byteOffset + sourceLength * sourceElementSize;
235d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    for(var rightIndex = sourceLength - 1;
236d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        rightIndex >= leftIndex && targetPtr >= sourcePtr;
237d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        rightIndex--) {
238d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      target[offset + rightIndex] = source[rightIndex];
239d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      targetPtr -= targetElementSize;
240d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      sourcePtr -= sourceElementSize;
241d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
242d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return rightIndex;
243d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
244d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var rightIndex = CopyRightPart();
245d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
246d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  var temp = new $Array(rightIndex + 1 - leftIndex);
247d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  for (var i = leftIndex; i <= rightIndex; i++) {
248d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    temp[i - leftIndex] = source[i];
249d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
250d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  for (i = leftIndex; i <= rightIndex; i++) {
251d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    target[offset + i] = temp[i - leftIndex];
252d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
253d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
254d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
25557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgfunction TypedArraySet(obj, offset) {
2561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset);
2571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (intOffset < 0) {
2581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    throw MakeTypeError("typed_array_set_negative_offset");
2591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
2600a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org
2619b95fd75bfb24acf6b51a360058331013e74fc73machenbach@chromium.org  if (intOffset > %_MaxSmi()) {
2620a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    throw MakeRangeError("typed_array_set_source_too_large");
2630a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  }
264d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  switch (%TypedArraySetFastCases(this, obj, intOffset)) {
265d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    // These numbers should be synchronized with runtime.cc.
266d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE
267d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return;
268d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING
269d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      TypedArraySetFromOverlappingTypedArray(this, obj, intOffset);
270d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return;
271d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING
272d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      TypedArraySetFromArrayLike(this, obj, obj.length, intOffset);
273d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return;
274d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY
275d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      var l = obj.length;
276d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      if (IS_UNDEFINED(l)) {
277d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        if (IS_NUMBER(obj)) {
278d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            // For number as a first argument, throw TypeError
279d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            // instead of silently ignoring the call, so that
280d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            // the user knows (s)he did something wrong.
281d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            // (Consistent with Firefox and Blink/WebKit)
282d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            throw MakeTypeError("invalid_argument");
283d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        }
284d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        return;
285d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      }
286d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      if (intOffset + l > this.length) {
287d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        throw MakeRangeError("typed_array_set_source_too_large");
288d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      }
289d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      TypedArraySetFromArrayLike(this, obj, l, intOffset);
290d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return;
29157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
292e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
293e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
29457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// -------------------------------------------------------------------
295e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2962f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgfunction SetupTypedArrays() {
2972f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgmacro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE)
298f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  %CheckIsBootstrapping();
2992f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  %SetCode(global.NAME, NAMEConstructor);
3002f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  %FunctionSetPrototype(global.NAME, new $Object());
301e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
3029bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  %AddNamedProperty(global.NAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE,
3039bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                    READ_ONLY | DONT_ENUM | DONT_DELETE);
3049bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  %AddNamedProperty(global.NAME.prototype,
3059bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                    "constructor", global.NAME, DONT_ENUM);
3069bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  %AddNamedProperty(global.NAME.prototype,
3079bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                    "BYTES_PER_ELEMENT", ELEMENT_SIZE,
3089bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                    READ_ONLY | DONT_ENUM | DONT_DELETE);
3092f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  InstallGetter(global.NAME.prototype, "buffer", NAME_GetBuffer);
3102f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  InstallGetter(global.NAME.prototype, "byteOffset", NAME_GetByteOffset);
3112f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  InstallGetter(global.NAME.prototype, "byteLength", NAME_GetByteLength);
3122f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  InstallGetter(global.NAME.prototype, "length", NAME_GetLength);
31357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
3142f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  InstallFunctions(global.NAME.prototype, DONT_ENUM, $Array(
3152f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org        "subarray", NAMESubArray,
31657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        "set", TypedArraySet
31757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  ));
318057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgendmacro
319057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
320057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgTYPED_ARRAYS(SETUP_TYPED_ARRAY)
3212f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org}
3222f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
3232f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgSetupTypedArrays();
3241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// --------------------------- DataView -----------------------------
3261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvar $DataView = global.DataView;
3281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3
3301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (%_IsConstructCall()) {
3311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (!IS_ARRAYBUFFER(buffer)) {
3321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      throw MakeTypeError('data_view_not_array_buffer', []);
3331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
3344452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    if (!IS_UNDEFINED(byteOffset)) {
3354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset');
3364452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    }
3374452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    if (!IS_UNDEFINED(byteLength)) {
3384452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        byteLength = TO_INTEGER(byteLength);
3394452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    }
3404452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
3412f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
3424452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
3434452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    var offset = IS_UNDEFINED(byteOffset) ?  0 : byteOffset;
3441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (offset > bufferByteLength) {
3451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      throw MakeRangeError('invalid_data_view_offset');
3461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
3474452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
3484452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    var length = IS_UNDEFINED(byteLength)
3494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        ? bufferByteLength - offset
3504452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        : byteLength;
3511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (length < 0 || offset + length > bufferByteLength) {
3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      throw new MakeRangeError('invalid_data_view_length');
3531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
354a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    %_DataViewInitialize(this, buffer, offset, length);
3551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  } else {
3561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    throw MakeTypeError('constructor_not_function', ["DataView"]);
3571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
3591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
360285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction DataViewGetBufferJS() {
3611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!IS_DATAVIEW(this)) {
362fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    throw MakeTypeError('incompatible_method_receiver',
3631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        ['DataView.buffer', this]);
3641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return %DataViewGetBuffer(this);
3661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
3671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction DataViewGetByteOffset() {
3691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!IS_DATAVIEW(this)) {
370fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    throw MakeTypeError('incompatible_method_receiver',
3711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        ['DataView.byteOffset', this]);
3721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3732f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %_ArrayBufferViewGetByteOffset(this);
3741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
3751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction DataViewGetByteLength() {
3771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!IS_DATAVIEW(this)) {
378fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    throw MakeTypeError('incompatible_method_receiver',
3791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                        ['DataView.byteLength', this]);
3801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3812f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return %_ArrayBufferViewGetByteLength(this);
3821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
3831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
384feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgmacro DATA_VIEW_TYPES(FUNCTION)
385feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Int8)
386feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Uint8)
387feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Int16)
388feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Uint16)
389feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Int32)
390feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Uint32)
391feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Float32)
392feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  FUNCTION(Float64)
393feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgendmacro
394feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
3951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction ToPositiveDataViewOffset(offset) {
3961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset');
3971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
3981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
399feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org
400feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgmacro DATA_VIEW_GETTER_SETTER(TYPENAME)
401285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction DataViewGetTYPENAMEJS(offset, little_endian) {
4021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!IS_DATAVIEW(this)) {
403fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    throw MakeTypeError('incompatible_method_receiver',
404feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                        ['DataView.getTYPENAME', this]);
4051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
406169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  if (%_ArgumentsLength() < 1) {
407169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    throw MakeTypeError('invalid_argument');
408169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
409feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  return %DataViewGetTYPENAME(this,
4101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                          ToPositiveDataViewOffset(offset),
4111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                          !!little_endian);
4121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
4131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
414285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgfunction DataViewSetTYPENAMEJS(offset, value, little_endian) {
4151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!IS_DATAVIEW(this)) {
416fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    throw MakeTypeError('incompatible_method_receiver',
417feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org                        ['DataView.setTYPENAME', this]);
4181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
419fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (%_ArgumentsLength() < 2) {
420169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    throw MakeTypeError('invalid_argument');
421169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
422feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.org  %DataViewSetTYPENAME(this,
4231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                   ToPositiveDataViewOffset(offset),
4241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                   TO_NUMBER_INLINE(value),
4251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                   !!little_endian);
4261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
427feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgendmacro
4281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
429feecfdecd0a36aaebe2d2b7cab8178d2b71d45cfmachenbach@chromium.orgDATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER)
4301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction SetupDataView() {
4321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  %CheckIsBootstrapping();
4331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Setup the DataView constructor.
4351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  %SetCode($DataView, DataViewConstructor);
4361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  %FunctionSetPrototype($DataView, new $Object);
4371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Set up constructor property on the DataView prototype.
4399bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  %AddNamedProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM);
4401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
441285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS);
4421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset);
4431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength);
4441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  InstallFunctions($DataView.prototype, DONT_ENUM, $Array(
446285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getInt8", DataViewGetInt8JS,
447285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setInt8", DataViewSetInt8JS,
4481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
449285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getUint8", DataViewGetUint8JS,
450285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setUint8", DataViewSetUint8JS,
4511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
452285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getInt16", DataViewGetInt16JS,
453285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setInt16", DataViewSetInt16JS,
4541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
455285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getUint16", DataViewGetUint16JS,
456285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setUint16", DataViewSetUint16JS,
4571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
458285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getInt32", DataViewGetInt32JS,
459285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setInt32", DataViewSetInt32JS,
4601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
461285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getUint32", DataViewGetUint32JS,
462285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setUint32", DataViewSetUint32JS,
4631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
464285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getFloat32", DataViewGetFloat32JS,
465285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setFloat32", DataViewSetFloat32JS,
4661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
467285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "getFloat64", DataViewGetFloat64JS,
468285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      "setFloat64", DataViewSetFloat64JS
4691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ));
4701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
4711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgSetupDataView();
473