Reviewers: Sven Panne,
https://codereview.chromium.org/203453002/diff/1/src/promise.js
File src/promise.js (right):
https://codereview.chromium.org/203453002/diff/1/src/promise.js#newcode236
src/promise.js:236: } catch(r) {
On 2014/03/18 14:46:18, Sven Panne wrote:
Let me guess why you changed this... :-D
Reg-exps are the null pointers of parsing....
Description:
Promises: make null a legal argument for .then
[email protected]
BUG=
Please review this at https://codereview.chromium.org/203453002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+22, -10 lines):
M src/promise.js
M test/mjsunit/es6/promises.js
Index: src/promise.js
diff --git a/src/promise.js b/src/promise.js
index
f700be909264cee92f077d60c5f331613ae86aed..f6b7bdff4b29a7af90b3d2ce21bd2712f3752e59
100644
--- a/src/promise.js
+++ b/src/promise.js
@@ -210,7 +210,10 @@ function PromiseHandle(value, handler, deferred) {
// Multi-unwrapped chaining with thenable coercion.
function PromiseThen(onResolve, onReject) {
- onResolve = IS_UNDEFINED(onResolve) ? PromiseIdResolveHandler :
onResolve;
+ onResolve =
+ IS_NULL_OR_UNDEFINED(onResolve) ? PromiseIdResolveHandler : onResolve;
+ onReject =
+ IS_NULL_OR_UNDEFINED(onReject) ? PromiseIdRejectHandler : onReject;
var that = this;
var constructor = this.constructor;
return this.chain(
@@ -230,11 +233,10 @@ function PromiseCoerce(constructor, x) {
var then;
try {
then = x.then;
- } catch(e) {
- var deferred = %_CallFunction(constructor, PromiseDeferred);
- PromiseCoerce.table.set(x, deferred.promise);
- deferred.reject(e);
- return deferred.promise;
+ } catch(r) {
+ var promise = %_CallFunction(constructor, r, PromiseRejected);
+ PromiseCoerce.table.set(x, promise);
+ return promise;
}
if (typeof then === 'function') {
if (PromiseCoerce.table.has(x)) {
@@ -244,8 +246,8 @@ function PromiseCoerce(constructor, x) {
PromiseCoerce.table.set(x, deferred.promise);
try {
%_CallFunction(x, deferred.resolve, deferred.reject, then);
- } catch(e) {
- deferred.reject(e);
+ } catch(r) {
+ deferred.reject(r);
}
return deferred.promise;
}
Index: test/mjsunit/es6/promises.js
diff --git a/test/mjsunit/es6/promises.js b/test/mjsunit/es6/promises.js
index
b5137931003ca397f0d116b95ef4e90921cebd7a..f1b191c2c6420c4f379e884ff1ff7813be160cc7
100644
--- a/test/mjsunit/es6/promises.js
+++ b/test/mjsunit/es6/promises.js
@@ -100,7 +100,12 @@ function assertAsyncDone(iteration) {
(function() {
Promise.resolve(5).then(undefined, assertUnreachable).chain(
- function(x) { assertAsync(x === 5, "resolved/then-nohandler") },
+ function(x) { assertAsync(x ===
5, "resolved/then-nohandler-undefined") },
+ assertUnreachable
+ )
+ assertAsyncRan()
+ Promise.resolve(6).then(null, assertUnreachable).chain(
+ function(x) { assertAsync(x === 6, "resolved/then-nohandler-null") },
assertUnreachable
)
assertAsyncRan()
@@ -109,7 +114,12 @@ function assertAsyncDone(iteration) {
(function() {
Promise.reject(5).then(assertUnreachable, undefined).chain(
assertUnreachable,
- function(r) { assertAsync(r === 5, "rejected/then-nohandler") }
+ function(r) { assertAsync(r ===
5, "rejected/then-nohandler-undefined") }
+ )
+ assertAsyncRan()
+ Promise.reject(6).then(assertUnreachable, null).chain(
+ assertUnreachable,
+ function(r) { assertAsync(r === 6, "rejected/then-nohandler-null") }
)
assertAsyncRan()
})();
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.