 Chromium Code Reviews
 Chromium Code Reviews Issue 1181903003:
  Allow TypedArrays to be initialized with iterables  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1181903003:
  Allow TypedArrays to be initialized with iterables  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/typedarray.js | 
| diff --git a/src/typedarray.js b/src/typedarray.js | 
| index 65659147ee7777cf1e8bc69196d4fc09a4beee89..05fb375e6ccda339ab2cf95e3078a04d600e96cd 100644 | 
| --- a/src/typedarray.js | 
| +++ b/src/typedarray.js | 
| @@ -43,6 +43,8 @@ utils.Import(function(from) { | 
| MathMin = from.MathMin; | 
| }); | 
| +var InternalArray = utils.InternalArray; | 
| + | 
| // --------------- Typed Arrays --------------------- | 
| macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) | 
| @@ -130,6 +132,17 @@ function NAMEConstructByArrayLike(obj, arrayLike) { | 
| } | 
| } | 
| +function NAMEConstructByIterable(obj, iterable, iteratorFn) { | 
| + var list = new InternalArray(); | 
| + var iterator = %_CallFunction(iterable, iteratorFn); | 
| + var newIterable = {}; | 
| + newIterable[symbolIterator] = function() { return iterator; }; | 
| 
adamk
2015/06/13 00:17:27
Sadly this will fail if someone monkeypatches Obje
 
caitp (gmail)
2015/06/13 00:49:24
The object can easily have a null prototype to avo
 
adamk
2015/06/13 00:50:44
Ah, yeah:
var newIterable = { __proto__: null };
 
Dan Ehrenberg
2015/06/13 05:16:30
Oh good idea. Seemed to pass the test. I guess com
 | 
| + for (var value of newIterable) { | 
| + list.push(value); | 
| + } | 
| + NAMEConstructByArrayLike(obj, list); | 
| +} | 
| + | 
| function NAMEConstructor(arg1, arg2, arg3) { | 
| if (%_IsConstructCall()) { | 
| if (IS_ARRAYBUFFER(arg1) || IS_SHAREDARRAYBUFFER(arg1)) { | 
| @@ -138,7 +151,14 @@ function NAMEConstructor(arg1, arg2, arg3) { | 
| IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) { | 
| NAMEConstructByLength(this, arg1); | 
| } else { | 
| - NAMEConstructByArrayLike(this, arg1); | 
| + var iteratorFn = arg1[symbolIterator]; | 
| + if (IS_UNDEFINED(iteratorFn) || iteratorFn === $arrayValues) { | 
| + NAMEConstructByArrayLike(this, arg1); | 
| + } else { | 
| + // TODO(littledan): The code here is lazy and looks up @@iterator | 
| + // twice. Currently, that's fine, but it'll be observable with proxies. | 
| + NAMEConstructByIterable(this, arg1, iteratorFn); | 
| + } | 
| } | 
| } else { | 
| throw MakeTypeError(kConstructorNotFunction, "NAME") |