Index: src/js/typedarray.js |
diff --git a/src/js/typedarray.js b/src/js/typedarray.js |
index b16dab2237f869a0645b114a75e0aa3949fc68f1..9cb5b6e9a07eef617e0d068558b88a5a9ab512f7 100644 |
--- a/src/js/typedarray.js |
+++ b/src/js/typedarray.js |
@@ -202,25 +202,18 @@ function NAMEConstructByLength(obj, length) { |
function NAMEConstructByArrayLike(obj, arrayLike) { |
var length = arrayLike.length; |
+ |
var l = ToPositiveInteger(length, kInvalidTypedArrayLength); |
if (l > %_MaxSmi()) { |
throw MakeRangeError(kInvalidTypedArrayLength); |
} |
- var initialized = false; |
var byteLength = l * ELEMENT_SIZE; |
- if (byteLength <= %_TypedArrayMaxSizeInHeap()) { |
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
|
- %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, false); |
- } else { |
- initialized = |
- %TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l); |
- } |
- if (!initialized) { |
- for (var i = 0; i < l; i++) { |
- // It is crucial that we let any execptions from arrayLike[i] |
- // propagate outside the function. |
- obj[i] = arrayLike[i]; |
- } |
+ %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength, false); |
+ for (var i = 0; i < l; i++) { |
+ // 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
|
+ // propagate outside the function. |
+ obj[i] = arrayLike[i]; |
} |
} |
@@ -251,20 +244,17 @@ function NAMEConstructByTypedArray(obj, typedArray) { |
var length = %_TypedArrayGetLength(typedArray); |
var byteLength = %_ArrayBufferViewGetByteLength(typedArray); |
var newByteLength = length * ELEMENT_SIZE; |
+ 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,
|
var bufferConstructor = SpeciesConstructor(srcData, GlobalArrayBuffer); |
- var data = new GlobalArrayBuffer(newByteLength); |
var prototype = bufferConstructor.prototype; |
// TODO(littledan): Use the right prototype based on bufferConstructor's realm |
if (IS_RECEIVER(prototype) && prototype !== GlobalArrayBufferPrototype) { |
- %InternalSetPrototype(data, prototype); |
+ %InternalSetPrototype(%TypedArrayGetBuffer(obj), prototype); |
} |
- %_TypedArrayInitialize(obj, ARRAY_ID, data, 0, newByteLength, true); |
- // Note: The separate CloneArrayBuffer path in the spec ensures |
- // that NaNs are not canonicalized, but because V8 does not |
- // canonicalize NaNs, we do not have to do anything different. |
- // TODO(littledan): Make a fastpath based on memcpy |
- for (var i = 0; i < length; i++) { |
- obj[i] = typedArray[i]; |
+ if (!initialized) { |
+ for (var i = 0; i < length; i++) { |
+ obj[i] = typedArray[i]; |
+ } |
} |
} |