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