Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

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

Issue 2247073004: Reland of Amend DataView, ArrayBuffer, and TypedArray methods to use ToIndex. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Correct messages Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/js/runtime.js ('k') | src/messages.h » ('j') | no next file with comments »
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 23 matching lines...) Expand all
34 var InnerArraySome; 34 var InnerArraySome;
35 var InnerArraySort; 35 var InnerArraySort;
36 var InnerArrayToLocaleString; 36 var InnerArrayToLocaleString;
37 var InternalArray = utils.InternalArray; 37 var InternalArray = utils.InternalArray;
38 var IsNaN; 38 var IsNaN;
39 var MaxSimple; 39 var MaxSimple;
40 var MinSimple; 40 var MinSimple;
41 var PackedArrayReverse; 41 var PackedArrayReverse;
42 var SpeciesConstructor; 42 var SpeciesConstructor;
43 var ToPositiveInteger; 43 var ToPositiveInteger;
44 var ToIndex;
44 var iteratorSymbol = utils.ImportNow("iterator_symbol"); 45 var iteratorSymbol = utils.ImportNow("iterator_symbol");
45 var speciesSymbol = utils.ImportNow("species_symbol"); 46 var speciesSymbol = utils.ImportNow("species_symbol");
46 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); 47 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
47 48
48 macro TYPED_ARRAYS(FUNCTION) 49 macro TYPED_ARRAYS(FUNCTION)
49 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. 50 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
50 FUNCTION(1, Uint8Array, 1) 51 FUNCTION(1, Uint8Array, 1)
51 FUNCTION(2, Int8Array, 1) 52 FUNCTION(2, Int8Array, 1)
52 FUNCTION(3, Uint16Array, 2) 53 FUNCTION(3, Uint16Array, 2)
53 FUNCTION(4, Int16Array, 2) 54 FUNCTION(4, Int16Array, 2)
(...skipping 28 matching lines...) Expand all
82 InnerArrayReduceRight = from.InnerArrayReduceRight; 83 InnerArrayReduceRight = from.InnerArrayReduceRight;
83 InnerArraySome = from.InnerArraySome; 84 InnerArraySome = from.InnerArraySome;
84 InnerArraySort = from.InnerArraySort; 85 InnerArraySort = from.InnerArraySort;
85 InnerArrayToLocaleString = from.InnerArrayToLocaleString; 86 InnerArrayToLocaleString = from.InnerArrayToLocaleString;
86 IsNaN = from.IsNaN; 87 IsNaN = from.IsNaN;
87 MaxSimple = from.MaxSimple; 88 MaxSimple = from.MaxSimple;
88 MinSimple = from.MinSimple; 89 MinSimple = from.MinSimple;
89 PackedArrayReverse = from.PackedArrayReverse; 90 PackedArrayReverse = from.PackedArrayReverse;
90 SpeciesConstructor = from.SpeciesConstructor; 91 SpeciesConstructor = from.SpeciesConstructor;
91 ToPositiveInteger = from.ToPositiveInteger; 92 ToPositiveInteger = from.ToPositiveInteger;
93 ToIndex = from.ToIndex;
92 }); 94 });
93 95
94 // --------------- Typed Arrays --------------------- 96 // --------------- Typed Arrays ---------------------
95 97
96 function TypedArrayDefaultConstructor(typedArray) { 98 function TypedArrayDefaultConstructor(typedArray) {
97 switch (%_ClassOf(typedArray)) { 99 switch (%_ClassOf(typedArray)) {
98 macro TYPED_ARRAY_CONSTRUCTOR_CASE(ARRAY_ID, NAME, ELEMENT_SIZE) 100 macro TYPED_ARRAY_CONSTRUCTOR_CASE(ARRAY_ID, NAME, ELEMENT_SIZE)
99 case "NAME": 101 case "NAME":
100 return GlobalNAME; 102 return GlobalNAME;
101 endmacro 103 endmacro
(...skipping 24 matching lines...) Expand all
126 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2, conservative) { 128 function TypedArraySpeciesCreate(exemplar, arg0, arg1, arg2, conservative) {
127 var defaultConstructor = TypedArrayDefaultConstructor(exemplar); 129 var defaultConstructor = TypedArrayDefaultConstructor(exemplar);
128 var constructor = SpeciesConstructor(exemplar, defaultConstructor, 130 var constructor = SpeciesConstructor(exemplar, defaultConstructor,
129 conservative); 131 conservative);
130 return TypedArrayCreate(constructor, arg0, arg1, arg2); 132 return TypedArrayCreate(constructor, arg0, arg1, arg2);
131 } 133 }
132 134
133 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) 135 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
134 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { 136 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) {
135 if (!IS_UNDEFINED(byteOffset)) { 137 if (!IS_UNDEFINED(byteOffset)) {
136 byteOffset = ToPositiveInteger(byteOffset, kInvalidTypedArrayLength); 138 byteOffset = ToIndex(byteOffset, kInvalidTypedArrayLength);
137 } 139 }
138 if (!IS_UNDEFINED(length)) { 140 if (!IS_UNDEFINED(length)) {
139 length = ToPositiveInteger(length, kInvalidTypedArrayLength); 141 length = ToIndex(length, kInvalidTypedArrayLength);
142 }
143 if (length > %_MaxSmi()) {
144 // Note: this is not per spec, but rather a constraint of our current
145 // representation (which uses smi's).
146 throw %make_range_error(kInvalidTypedArrayLength);
140 } 147 }
141 148
142 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); 149 var bufferByteLength = %_ArrayBufferGetByteLength(buffer);
143 var offset; 150 var offset;
144 if (IS_UNDEFINED(byteOffset)) { 151 if (IS_UNDEFINED(byteOffset)) {
145 offset = 0; 152 offset = 0;
146 } else { 153 } else {
147 offset = byteOffset; 154 offset = byteOffset;
148 155
149 if (offset % ELEMENT_SIZE !== 0) { 156 if (offset % ELEMENT_SIZE !== 0) {
150 throw %make_range_error(kInvalidTypedArrayAlignment, 157 throw %make_range_error(kInvalidTypedArrayAlignment,
151 "start offset", "NAME", ELEMENT_SIZE); 158 "start offset", "NAME", ELEMENT_SIZE);
152 } 159 }
153 if (offset > bufferByteLength) {
154 throw %make_range_error(kInvalidTypedArrayOffset);
155 }
156 } 160 }
157 161
158 var newByteLength; 162 var newByteLength;
159 var newLength;
160 if (IS_UNDEFINED(length)) { 163 if (IS_UNDEFINED(length)) {
161 if (bufferByteLength % ELEMENT_SIZE !== 0) { 164 if (bufferByteLength % ELEMENT_SIZE !== 0) {
162 throw %make_range_error(kInvalidTypedArrayAlignment, 165 throw %make_range_error(kInvalidTypedArrayAlignment,
163 "byte length", "NAME", ELEMENT_SIZE); 166 "byte length", "NAME", ELEMENT_SIZE);
164 } 167 }
165 newByteLength = bufferByteLength - offset; 168 newByteLength = bufferByteLength - offset;
166 newLength = newByteLength / ELEMENT_SIZE; 169 if (newByteLength < 0) {
170 throw %make_range_error(kInvalidTypedArrayAlignment,
171 "byte length", "NAME", ELEMENT_SIZE);
172 }
167 } else { 173 } else {
168 var newLength = length; 174 newByteLength = length * ELEMENT_SIZE;
169 newByteLength = newLength * ELEMENT_SIZE; 175 if (offset + newByteLength > bufferByteLength) {
170 } 176 throw %make_range_error(kInvalidTypedArrayLength);
171 if ((offset + newByteLength > bufferByteLength) 177 }
172 || (newLength > %_MaxSmi())) {
173 throw %make_range_error(kInvalidTypedArrayLength);
174 } 178 }
175 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength, true); 179 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength, true);
176 } 180 }
177 181
178 function NAMEConstructByLength(obj, length) { 182 function NAMEConstructByLength(obj, length) {
179 var l = IS_UNDEFINED(length) ? 183 var l = IS_UNDEFINED(length) ?
180 0 : ToPositiveInteger(length, kInvalidTypedArrayLength); 184 0 : ToIndex(length, kInvalidTypedArrayLength);
181 if (l > %_MaxSmi()) { 185 if (length > %_MaxSmi()) {
186 // Note: this is not per spec, but rather a constraint of our current
187 // representation (which uses smi's).
182 throw %make_range_error(kInvalidTypedArrayLength); 188 throw %make_range_error(kInvalidTypedArrayLength);
183 } 189 }
184 var byteLength = l * ELEMENT_SIZE; 190 var byteLength = l * ELEMENT_SIZE;
185 if (byteLength > %_TypedArrayMaxSizeInHeap()) { 191 if (byteLength > %_TypedArrayMaxSizeInHeap()) {
186 var buffer = new GlobalArrayBuffer(byteLength); 192 var buffer = new GlobalArrayBuffer(byteLength);
187 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true); 193 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true);
188 } else { 194 } else {
189 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true); 195 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true);
190 } 196 }
191 } 197 }
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 FUNCTION(Float64) 929 FUNCTION(Float64)
924 endmacro 930 endmacro
925 931
926 932
927 macro DATA_VIEW_GETTER_SETTER(TYPENAME) 933 macro DATA_VIEW_GETTER_SETTER(TYPENAME)
928 function DataViewGetTYPENAMEJS(offset, little_endian) { 934 function DataViewGetTYPENAMEJS(offset, little_endian) {
929 if (!IS_DATAVIEW(this)) { 935 if (!IS_DATAVIEW(this)) {
930 throw %make_type_error(kIncompatibleMethodReceiver, 936 throw %make_type_error(kIncompatibleMethodReceiver,
931 'DataView.getTYPENAME', this); 937 'DataView.getTYPENAME', this);
932 } 938 }
933 if (arguments.length < 1) throw %make_type_error(kInvalidArgument); 939 offset = IS_UNDEFINED(offset) ? 0 : ToIndex(offset, kInvalidDataViewAccessorOf fset);
934 offset = ToPositiveInteger(offset, kInvalidDataViewAccessorOffset);
935 return %DataViewGetTYPENAME(this, offset, !!little_endian); 940 return %DataViewGetTYPENAME(this, offset, !!little_endian);
936 } 941 }
937 %FunctionSetLength(DataViewGetTYPENAMEJS, 1); 942 %FunctionSetLength(DataViewGetTYPENAMEJS, 1);
938 943
939 function DataViewSetTYPENAMEJS(offset, value, little_endian) { 944 function DataViewSetTYPENAMEJS(offset, value, little_endian) {
940 if (!IS_DATAVIEW(this)) { 945 if (!IS_DATAVIEW(this)) {
941 throw %make_type_error(kIncompatibleMethodReceiver, 946 throw %make_type_error(kIncompatibleMethodReceiver,
942 'DataView.setTYPENAME', this); 947 'DataView.setTYPENAME', this);
943 } 948 }
944 if (arguments.length < 2) throw %make_type_error(kInvalidArgument); 949 offset = IS_UNDEFINED(offset) ? 0 : ToIndex(offset, kInvalidDataViewAccessorOf fset);
945 offset = ToPositiveInteger(offset, kInvalidDataViewAccessorOffset);
946 %DataViewSetTYPENAME(this, offset, TO_NUMBER(value), !!little_endian); 950 %DataViewSetTYPENAME(this, offset, TO_NUMBER(value), !!little_endian);
947 } 951 }
948 %FunctionSetLength(DataViewSetTYPENAMEJS, 2); 952 %FunctionSetLength(DataViewSetTYPENAMEJS, 2);
949 endmacro 953 endmacro
950 954
951 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) 955 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER)
952 956
953 utils.InstallFunctions(GlobalDataView.prototype, DONT_ENUM, [ 957 utils.InstallFunctions(GlobalDataView.prototype, DONT_ENUM, [
954 "getInt8", DataViewGetInt8JS, 958 "getInt8", DataViewGetInt8JS,
955 "setInt8", DataViewSetInt8JS, 959 "setInt8", DataViewSetInt8JS,
(...skipping 14 matching lines...) Expand all
970 "setUint32", DataViewSetUint32JS, 974 "setUint32", DataViewSetUint32JS,
971 975
972 "getFloat32", DataViewGetFloat32JS, 976 "getFloat32", DataViewGetFloat32JS,
973 "setFloat32", DataViewSetFloat32JS, 977 "setFloat32", DataViewSetFloat32JS,
974 978
975 "getFloat64", DataViewGetFloat64JS, 979 "getFloat64", DataViewGetFloat64JS,
976 "setFloat64", DataViewSetFloat64JS 980 "setFloat64", DataViewSetFloat64JS
977 ]); 981 ]);
978 982
979 }) 983 })
OLDNEW
« no previous file with comments | « src/js/runtime.js ('k') | src/messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698