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