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

Unified Diff: src/typedarray.js

Issue 1181903003: Allow TypedArrays to be initialized with iterables (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix iterator multiple lookup issue Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/mjsunit/harmony/typedarrays.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/typedarray.js
diff --git a/src/typedarray.js b/src/typedarray.js
index 65659147ee7777cf1e8bc69196d4fc09a4beee89..796f61e5e7c906b34e572deaf83fabe7fc3184a8 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 current = iterator.next();
+ while (!current.done) {
arv (Not doing code reviews) 2015/06/12 10:04:50 The main benefit of using for-of is that you get e
+ list.push(current.value);
caitp (gmail) 2015/06/12 02:47:21 Sorry to nitpick, but this is missing a piece of t
Dan Ehrenberg 2015/06/12 15:30:54 Done.
+ current = iterator.next();
+ }
+ 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")
« no previous file with comments | « no previous file | test/mjsunit/harmony/typedarrays.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698