diff options
Diffstat (limited to 'deps/v8/src/promise.js')
-rw-r--r-- | deps/v8/src/promise.js | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/deps/v8/src/promise.js b/deps/v8/src/promise.js index c096296b0e..c7bd204bb0 100644 --- a/deps/v8/src/promise.js +++ b/deps/v8/src/promise.js @@ -44,7 +44,7 @@ var lastMicrotaskId = 0; throw MakeTypeError('resolver_not_a_function', [resolver]); var promise = PromiseInit(this); try { - %DebugPushPromise(promise); + %DebugPushPromise(promise, Promise); resolver(function(x) { PromiseResolve(promise, x) }, function(r) { PromiseReject(promise, r) }); } catch (e) { @@ -110,7 +110,7 @@ var lastMicrotaskId = 0; function PromiseHandle(value, handler, deferred) { try { - %DebugPushPromise(deferred.promise); + %DebugPushPromise(deferred.promise, PromiseHandle); DEBUG_PREPARE_STEP_IN_IF_STEPPING(handler); var result = handler(value); if (result === deferred.promise) @@ -301,51 +301,44 @@ var lastMicrotaskId = 0; return IsPromise(x) ? x : new this(function(resolve) { resolve(x) }); } - function PromiseAll(values) { + function PromiseAll(iterable) { var deferred = %_CallFunction(this, PromiseDeferred); var resolutions = []; - if (!%_IsArray(values)) { - deferred.reject(MakeTypeError('invalid_argument')); - return deferred.promise; - } try { - var count = values.length; - if (count === 0) { - deferred.resolve(resolutions); - } else { - for (var i = 0; i < values.length; ++i) { - this.resolve(values[i]).then( - (function() { - // Nested scope to get closure over current i (and avoid .bind). - // TODO(rossberg): Use for-let instead once available. - var i_captured = i; + var count = 0; + var i = 0; + for (var value of iterable) { + this.resolve(value).then( + // Nested scope to get closure over current i. + // TODO(arv): Use an inner let binding once available. + (function(i) { return function(x) { - resolutions[i_captured] = x; + resolutions[i] = x; if (--count === 0) deferred.resolve(resolutions); - }; - })(), - function(r) { deferred.reject(r) } - ); - } + } + })(i), + function(r) { deferred.reject(r); }); + ++i; + ++count; + } + + if (count === 0) { + deferred.resolve(resolutions); } + } catch (e) { deferred.reject(e) } return deferred.promise; } - function PromiseOne(values) { + function PromiseRace(iterable) { var deferred = %_CallFunction(this, PromiseDeferred); - if (!%_IsArray(values)) { - deferred.reject(MakeTypeError('invalid_argument')); - return deferred.promise; - } try { - for (var i = 0; i < values.length; ++i) { - this.resolve(values[i]).then( - function(x) { deferred.resolve(x) }, - function(r) { deferred.reject(r) } - ); + for (var value of iterable) { + this.resolve(value).then( + function(x) { deferred.resolve(x) }, + function(r) { deferred.reject(r) }); } } catch (e) { deferred.reject(e) @@ -388,7 +381,7 @@ var lastMicrotaskId = 0; "accept", PromiseResolved, "reject", PromiseRejected, "all", PromiseAll, - "race", PromiseOne, + "race", PromiseRace, "resolve", PromiseCast ]); InstallFunctions($Promise.prototype, DONT_ENUM, [ |