Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 if (byteLength > %_TypedArrayMaxSizeInHeap()) { | 195 if (byteLength > %_TypedArrayMaxSizeInHeap()) { |
| 196 var buffer = new GlobalArrayBuffer(byteLength); | 196 var buffer = new GlobalArrayBuffer(byteLength); |
| 197 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true); | 197 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength, true); |
| 198 } else { | 198 } else { |
| 199 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true); | 199 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, true); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 function NAMEConstructByArrayLike(obj, arrayLike) { | 203 function NAMEConstructByArrayLike(obj, arrayLike) { |
| 204 var length = arrayLike.length; | 204 var length = arrayLike.length; |
| 205 | |
| 205 var l = ToPositiveInteger(length, kInvalidTypedArrayLength); | 206 var l = ToPositiveInteger(length, kInvalidTypedArrayLength); |
| 206 | 207 |
| 207 if (l > %_MaxSmi()) { | 208 if (l > %_MaxSmi()) { |
| 208 throw MakeRangeError(kInvalidTypedArrayLength); | 209 throw MakeRangeError(kInvalidTypedArrayLength); |
| 209 } | 210 } |
| 210 var initialized = false; | |
| 211 var byteLength = l * ELEMENT_SIZE; | 211 var byteLength = l * ELEMENT_SIZE; |
| 212 if (byteLength <= %_TypedArrayMaxSizeInHeap()) { | 212 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, false); |
|
adamk
2016/03/08 19:32:10
What's up with this if statement? Why is it OK to
Dan Ehrenberg
2016/03/08 19:55:55
Apparently it wasn't, and this was found by the te
| |
| 213 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, false); | 213 for (var i = 0; i < l; i++) { |
| 214 } else { | 214 // It is crucial that we let any exceptions from arrayLike[i] |
|
adamk
2016/03/08 19:32:10
Not sure this comment is worth keeping around.
Dan Ehrenberg
2016/03/08 19:55:54
How about I leave all this as is for now, since I'
adamk
2016/03/08 20:05:39
Fine to leave for now since you're not touching it
| |
| 215 initialized = | 215 // propagate outside the function. |
| 216 %TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l); | 216 obj[i] = arrayLike[i]; |
| 217 } | |
| 218 if (!initialized) { | |
| 219 for (var i = 0; i < l; i++) { | |
| 220 // It is crucial that we let any execptions from arrayLike[i] | |
| 221 // propagate outside the function. | |
| 222 obj[i] = arrayLike[i]; | |
| 223 } | |
| 224 } | 217 } |
| 225 } | 218 } |
| 226 | 219 |
| 227 function NAMEConstructByIterable(obj, iterable, iteratorFn) { | 220 function NAMEConstructByIterable(obj, iterable, iteratorFn) { |
| 228 var list = new InternalArray(); | 221 var list = new InternalArray(); |
| 229 // Reading the Symbol.iterator property of iterable twice would be | 222 // Reading the Symbol.iterator property of iterable twice would be |
| 230 // observable with getters, so instead, we call the function which | 223 // observable with getters, so instead, we call the function which |
| 231 // was already looked up, and wrap it in another iterable. The | 224 // was already looked up, and wrap it in another iterable. The |
| 232 // __proto__ of the new iterable is set to null to avoid any chance | 225 // __proto__ of the new iterable is set to null to avoid any chance |
| 233 // of modifications to Object.prototype being observable here. | 226 // of modifications to Object.prototype being observable here. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 244 NAMEConstructByArrayLike(obj, list); | 237 NAMEConstructByArrayLike(obj, list); |
| 245 } | 238 } |
| 246 | 239 |
| 247 // ES#sec-typedarray-typedarray TypedArray ( typedArray ) | 240 // ES#sec-typedarray-typedarray TypedArray ( typedArray ) |
| 248 function NAMEConstructByTypedArray(obj, typedArray) { | 241 function NAMEConstructByTypedArray(obj, typedArray) { |
| 249 // TODO(littledan): Throw on detached typedArray | 242 // TODO(littledan): Throw on detached typedArray |
| 250 var srcData = %TypedArrayGetBuffer(typedArray); | 243 var srcData = %TypedArrayGetBuffer(typedArray); |
| 251 var length = %_TypedArrayGetLength(typedArray); | 244 var length = %_TypedArrayGetLength(typedArray); |
| 252 var byteLength = %_ArrayBufferViewGetByteLength(typedArray); | 245 var byteLength = %_ArrayBufferViewGetByteLength(typedArray); |
| 253 var newByteLength = length * ELEMENT_SIZE; | 246 var newByteLength = length * ELEMENT_SIZE; |
| 247 var initialized = %TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, typedArray , length); | |
|
adamk
2016/03/08 19:32:10
Will this ever return false? If not, and this is t
Dan Ehrenberg
2016/03/08 19:55:54
I played around with a bunch of alternatives here,
| |
| 254 var bufferConstructor = SpeciesConstructor(srcData, GlobalArrayBuffer); | 248 var bufferConstructor = SpeciesConstructor(srcData, GlobalArrayBuffer); |
| 255 var data = new GlobalArrayBuffer(newByteLength); | |
| 256 var prototype = bufferConstructor.prototype; | 249 var prototype = bufferConstructor.prototype; |
| 257 // TODO(littledan): Use the right prototype based on bufferConstructor's realm | 250 // TODO(littledan): Use the right prototype based on bufferConstructor's realm |
| 258 if (IS_RECEIVER(prototype) && prototype !== GlobalArrayBufferPrototype) { | 251 if (IS_RECEIVER(prototype) && prototype !== GlobalArrayBufferPrototype) { |
| 259 %InternalSetPrototype(data, prototype); | 252 %InternalSetPrototype(%TypedArrayGetBuffer(obj), prototype); |
| 260 } | 253 } |
| 261 %_TypedArrayInitialize(obj, ARRAY_ID, data, 0, newByteLength, true); | 254 if (!initialized) { |
| 262 // Note: The separate CloneArrayBuffer path in the spec ensures | 255 for (var i = 0; i < length; i++) { |
| 263 // that NaNs are not canonicalized, but because V8 does not | 256 obj[i] = typedArray[i]; |
| 264 // canonicalize NaNs, we do not have to do anything different. | 257 } |
| 265 // TODO(littledan): Make a fastpath based on memcpy | |
| 266 for (var i = 0; i < length; i++) { | |
| 267 obj[i] = typedArray[i]; | |
| 268 } | 258 } |
| 269 } | 259 } |
| 270 | 260 |
| 271 function NAMEConstructor(arg1, arg2, arg3) { | 261 function NAMEConstructor(arg1, arg2, arg3) { |
| 272 if (!IS_UNDEFINED(new.target)) { | 262 if (!IS_UNDEFINED(new.target)) { |
| 273 if (IS_ARRAYBUFFER(arg1) || IS_SHAREDARRAYBUFFER(arg1)) { | 263 if (IS_ARRAYBUFFER(arg1) || IS_SHAREDARRAYBUFFER(arg1)) { |
| 274 NAMEConstructByArrayBuffer(this, arg1, arg2, arg3); | 264 NAMEConstructByArrayBuffer(this, arg1, arg2, arg3); |
| 275 } else if (IS_NUMBER(arg1) || IS_STRING(arg1) || | 265 } else if (IS_NUMBER(arg1) || IS_STRING(arg1) || |
| 276 IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) { | 266 IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) { |
| 277 NAMEConstructByLength(this, arg1); | 267 NAMEConstructByLength(this, arg1); |
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1006 "setUint32", DataViewSetUint32JS, | 996 "setUint32", DataViewSetUint32JS, |
| 1007 | 997 |
| 1008 "getFloat32", DataViewGetFloat32JS, | 998 "getFloat32", DataViewGetFloat32JS, |
| 1009 "setFloat32", DataViewSetFloat32JS, | 999 "setFloat32", DataViewSetFloat32JS, |
| 1010 | 1000 |
| 1011 "getFloat64", DataViewGetFloat64JS, | 1001 "getFloat64", DataViewGetFloat64JS, |
| 1012 "setFloat64", DataViewSetFloat64JS | 1002 "setFloat64", DataViewSetFloat64JS |
| 1013 ]); | 1003 ]); |
| 1014 | 1004 |
| 1015 }) | 1005 }) |
| OLD | NEW |