Chromium Code Reviews

Side by Side Diff: src/js/typedarray.js

Issue 2090353003: Amend DataView, ArrayBuffer, and TypedArray methods to use ToIndex. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « src/js/runtime.js ('k') | src/messages.h » ('j') | src/messages.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 (function(global, utils) { 5 (function(global, utils) {
6 6
7 "use strict"; 7 "use strict";
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
(...skipping 28 matching lines...)
39 var InnerArrayToLocaleString; 39 var InnerArrayToLocaleString;
40 var InternalArray = utils.InternalArray; 40 var InternalArray = utils.InternalArray;
41 var IsNaN; 41 var IsNaN;
42 var MakeRangeError; 42 var MakeRangeError;
43 var MakeTypeError; 43 var MakeTypeError;
44 var MaxSimple; 44 var MaxSimple;
45 var MinSimple; 45 var MinSimple;
46 var PackedArrayReverse; 46 var PackedArrayReverse;
47 var SpeciesConstructor; 47 var SpeciesConstructor;
48 var ToPositiveInteger; 48 var ToPositiveInteger;
49 var ToIndex;
49 var iteratorSymbol = utils.ImportNow("iterator_symbol"); 50 var iteratorSymbol = utils.ImportNow("iterator_symbol");
50 var speciesSymbol = utils.ImportNow("species_symbol"); 51 var speciesSymbol = utils.ImportNow("species_symbol");
51 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); 52 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
52 53
53 macro TYPED_ARRAYS(FUNCTION) 54 macro TYPED_ARRAYS(FUNCTION)
54 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. 55 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
55 FUNCTION(1, Uint8Array, 1) 56 FUNCTION(1, Uint8Array, 1)
56 FUNCTION(2, Int8Array, 1) 57 FUNCTION(2, Int8Array, 1)
57 FUNCTION(3, Uint16Array, 2) 58 FUNCTION(3, Uint16Array, 2)
58 FUNCTION(4, Int16Array, 2) 59 FUNCTION(4, Int16Array, 2)
(...skipping 33 matching lines...)
92 InnerArraySort = from.InnerArraySort; 93 InnerArraySort = from.InnerArraySort;
93 InnerArrayToLocaleString = from.InnerArrayToLocaleString; 94 InnerArrayToLocaleString = from.InnerArrayToLocaleString;
94 IsNaN = from.IsNaN; 95 IsNaN = from.IsNaN;
95 MakeRangeError = from.MakeRangeError; 96 MakeRangeError = from.MakeRangeError;
96 MakeTypeError = from.MakeTypeError; 97 MakeTypeError = from.MakeTypeError;
97 MaxSimple = from.MaxSimple; 98 MaxSimple = from.MaxSimple;
98 MinSimple = from.MinSimple; 99 MinSimple = from.MinSimple;
99 PackedArrayReverse = from.PackedArrayReverse; 100 PackedArrayReverse = from.PackedArrayReverse;
100 SpeciesConstructor = from.SpeciesConstructor; 101 SpeciesConstructor = from.SpeciesConstructor;
101 ToPositiveInteger = from.ToPositiveInteger; 102 ToPositiveInteger = from.ToPositiveInteger;
103 ToIndex = from.ToIndex;
102 }); 104 });
103 105
104 // --------------- Typed Arrays --------------------- 106 // --------------- Typed Arrays ---------------------
105 107
106 function TypedArrayDefaultConstructor(typedArray) { 108 function TypedArrayDefaultConstructor(typedArray) {
107 switch (%_ClassOf(typedArray)) { 109 switch (%_ClassOf(typedArray)) {
108 macro TYPED_ARRAY_CONSTRUCTOR_CASE(ARRAY_ID, NAME, ELEMENT_SIZE) 110 macro TYPED_ARRAY_CONSTRUCTOR_CASE(ARRAY_ID, NAME, ELEMENT_SIZE)
109 case "NAME": 111 case "NAME":
110 return GlobalNAME; 112 return GlobalNAME;
111 endmacro 113 endmacro
(...skipping 24 matching lines...)
136 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2, conservative) { 138 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2, conservative) {
137 var defaultConstructor = TypedArrayDefaultConstructor(exemplar); 139 var defaultConstructor = TypedArrayDefaultConstructor(exemplar);
138 var constructor = SpeciesConstructor(exemplar, defaultConstructor, 140 var constructor = SpeciesConstructor(exemplar, defaultConstructor,
139 conservative); 141 conservative);
140 return TypedArrayCreate(constructor, arg0, arg1, arg2); 142 return TypedArrayCreate(constructor, arg0, arg1, arg2);
141 } 143 }
142 144
143 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) 145 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
144 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { 146 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) {
145 if (!IS_UNDEFINED(byteOffset)) { 147 if (!IS_UNDEFINED(byteOffset)) {
146 byteOffset = ToPositiveInteger(byteOffset, kInvalidTypedArrayLength); 148 byteOffset = ToIndex(byteOffset, kInvalidTypedArrayLength);
147 } 149 }
148 if (!IS_UNDEFINED(length)) { 150 if (!IS_UNDEFINED(length)) {
149 length = ToPositiveInteger(length, kInvalidTypedArrayLength); 151 length = ToIndex(length, kInvalidTypedArrayLength);
152 }
153 if (length > %_MaxSmi()) { // note: this is not per spec; we just don't want t o allocate excessively large arrays
154 throw MakeRangeError(kInvalidTypedArrayLength);
150 } 155 }
151 156
152 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); 157 var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
153 var offset; 158 var offset;
154 if (IS_UNDEFINED(byteOffset)) { 159 if (IS_UNDEFINED(byteOffset)) {
155 offset = 0; 160 offset = 0;
156 } else { 161 } else {
157 offset = byteOffset; 162 offset = byteOffset;
158 163
159 if (offset % ELEMENT_SIZE !== 0) { 164 if (offset % ELEMENT_SIZE !== 0) {
160 throw MakeRangeError(kInvalidTypedArrayAlignment, 165 throw MakeRangeError(kInvalidTypedArrayAlignment,
161 "start offset", "NAME", ELEMENT_SIZE); 166 "start offset", "NAME", ELEMENT_SIZE);
162 } 167 }
163 if (offset > bufferByteLength) {
164 throw MakeRangeError(kInvalidTypedArrayOffset);
165 }
166 } 168 }
167 169
168 var newByteLength; 170 var newByteLength;
169 var newLength;
170 if (IS_UNDEFINED(length)) { 171 if (IS_UNDEFINED(length)) {
171 if (bufferByteLength % ELEMENT_SIZE !== 0) { 172 if (bufferByteLength % ELEMENT_SIZE !== 0) {
172 throw MakeRangeError(kInvalidTypedArrayAlignment, 173 throw MakeRangeError(kInvalidTypedArrayAlignment,
173 "byte length", "NAME", ELEMENT_SIZE); 174 "byte length", "NAME", ELEMENT_SIZE);
174 } 175 }
175 newByteLength = bufferByteLength - offset; 176 newByteLength = bufferByteLength - offset;
176 newLength = newByteLength / ELEMENT_SIZE; 177 if (newByteLength < 0) {
178 throw MakeRangeError(kInvalidTypedArrayAlignment,
179 "byte length", "NAME", ELEMENT_SIZE);
180 }
177 } else { 181 } else {
178 var newLength = length; 182 newByteLength = length * ELEMENT_SIZE;
179 newByteLength = newLength * ELEMENT_SIZE; 183 if (offset + newByteLength > bufferByteLength) {
180 } 184 throw MakeRangeError(kInvalidTypedArrayAlignment,
181 if ((offset + newByteLength > bufferByteLength) 185 "byte length", "NAME", ELEMENT_SIZE);
182 || (newLength > %_MaxSmi())) { 186 }
183 throw MakeRangeError(kInvalidTypedArrayLength);
184 } 187 }
185 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength, true); 188 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength, true);
186 } 189 }
187 190
188 function NAMEConstructByLength(obj, length) { 191 function NAMEConstructByLength(obj, length) {
189 var l = IS_UNDEFINED(length) ? 192 var l = IS_UNDEFINED(length) ?
190 0 : ToPositiveInteger(length, kInvalidTypedArrayLength); 193 0 : ToIndex(length, kInvalidTypedArrayLength);
191 if (l > %_MaxSmi()) { 194 if (length > %_MaxSmi()) { // note: this is not per spec; we just don't want t o allocate excessively large arrays
192 throw MakeRangeError(kInvalidTypedArrayLength); 195 throw MakeRangeError(kInvalidTypedArrayLength);
193 } 196 }
194 var byteLength = l * ELEMENT_SIZE; 197 var byteLength = l * ELEMENT_SIZE;
195 if (byteLength > %_TypedArrayMaxSizeInHeap()) { 198 if (byteLength > %_TypedArrayMaxSizeInHeap()) {
196 var buffer = new GlobalArrayBuffer(byteLength); 199 var buffer = new GlobalArrayBuffer(byteLength);
197 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true); 200 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true);
198 } else { 201 } else {
199 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true); 202 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true);
200 } 203 }
201 } 204 }
(...skipping 657 matching lines...)
859 FUNCTION(Float64) 862 FUNCTION(Float64)
860 endmacro 863 endmacro
861 864
862 865
863 macro DATA_VIEW_GETTER_SETTER(TYPENAME) 866 macro DATA_VIEW_GETTER_SETTER(TYPENAME)
864 function DataViewGetTYPENAMEJS(offset, little_endian) { 867 function DataViewGetTYPENAMEJS(offset, little_endian) {
865 if (!IS_DATAVIEW(this)) { 868 if (!IS_DATAVIEW(this)) {
866 throw MakeTypeError(kIncompatibleMethodReceiver, 869 throw MakeTypeError(kIncompatibleMethodReceiver,
867 'DataView.getTYPENAME', this); 870 'DataView.getTYPENAME', this);
868 } 871 }
869 if (arguments.length < 1) throw MakeTypeError(kInvalidArgument); 872 offset = IS_UNDEFINED(offset) ? 0 : ToIndex(offset, kInvalidDataViewAccessorOf fset);
870 offset = ToPositiveInteger(offset, kInvalidDataViewAccessorOffset);
871 return %DataViewGetTYPENAME(this, offset, !!little_endian); 873 return %DataViewGetTYPENAME(this, offset, !!little_endian);
872 } 874 }
873 %FunctionSetLength(DataViewGetTYPENAMEJS, 1); 875 %FunctionSetLength(DataViewGetTYPENAMEJS, 1);
874 876
875 function DataViewSetTYPENAMEJS(offset, value, little_endian) { 877 function DataViewSetTYPENAMEJS(offset, value, little_endian) {
876 if (!IS_DATAVIEW(this)) { 878 if (!IS_DATAVIEW(this)) {
877 throw MakeTypeError(kIncompatibleMethodReceiver, 879 throw MakeTypeError(kIncompatibleMethodReceiver,
878 'DataView.setTYPENAME', this); 880 'DataView.setTYPENAME', this);
879 } 881 }
880 if (arguments.length < 2) throw MakeTypeError(kInvalidArgument); 882 offset = IS_UNDEFINED(offset) ? 0 : ToIndex(offset, kInvalidDataViewAccessorOf fset);
881 offset = ToPositiveInteger(offset, kInvalidDataViewAccessorOffset);
882 %DataViewSetTYPENAME(this, offset, TO_NUMBER(value), !!little_endian); 883 %DataViewSetTYPENAME(this, offset, TO_NUMBER(value), !!little_endian);
883 } 884 }
884 %FunctionSetLength(DataViewSetTYPENAMEJS, 2); 885 %FunctionSetLength(DataViewSetTYPENAMEJS, 2);
885 endmacro 886 endmacro
886 887
887 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) 888 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER)
888 889
889 utils.InstallFunctions(GlobalDataView.prototype, DONT_ENUM, [ 890 utils.InstallFunctions(GlobalDataView.prototype, DONT_ENUM, [
890 "getInt8", DataViewGetInt8JS, 891 "getInt8", DataViewGetInt8JS,
891 "setInt8", DataViewSetInt8JS, 892 "setInt8", DataViewSetInt8JS,
(...skipping 14 matching lines...)
906 "setUint32", DataViewSetUint32JS, 907 "setUint32", DataViewSetUint32JS,
907 908
908 "getFloat32", DataViewGetFloat32JS, 909 "getFloat32", DataViewGetFloat32JS,
909 "setFloat32", DataViewSetFloat32JS, 910 "setFloat32", DataViewSetFloat32JS,
910 911
911 "getFloat64", DataViewGetFloat64JS, 912 "getFloat64", DataViewGetFloat64JS,
912 "setFloat64", DataViewSetFloat64JS 913 "setFloat64", DataViewSetFloat64JS
913 ]); 914 ]);
914 915
915 }) 916 })
OLDNEW
« no previous file with comments | « src/js/runtime.js ('k') | src/messages.h » ('j') | src/messages.h » ('J')

Powered by Google App Engine