OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 (function(global, utils, extrasUtils) { | 5 (function(global, utils, extrasUtils) { |
6 | 6 |
7 "use strict"; | 7 "use strict"; |
8 | 8 |
9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
10 | 10 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 // which is usually simply noise. Do not trigger that debug event. | 286 // which is usually simply noise. Do not trigger that debug event. |
287 %PromiseRejectEvent(promise, r, false); | 287 %PromiseRejectEvent(promise, r, false); |
288 return promise; | 288 return promise; |
289 } else { | 289 } else { |
290 var promiseCapability = NewPromiseCapability(this); | 290 var promiseCapability = NewPromiseCapability(this); |
291 %_Call(promiseCapability.reject, UNDEFINED, r); | 291 %_Call(promiseCapability.reject, UNDEFINED, r); |
292 return promiseCapability.promise; | 292 return promiseCapability.promise; |
293 } | 293 } |
294 } | 294 } |
295 | 295 |
| 296 // Shortcut Promise.reject and Promise.resolve() implementations, used by |
| 297 // Async Functions implementation. |
| 298 function PromiseCreateRejected(r) { |
| 299 var promise = PromiseCreateAndSet(-1, r); |
| 300 %PromiseRejectEvent(promise, r, false); |
| 301 return promise; |
| 302 } |
| 303 |
| 304 function PromiseCreateResolved(x) { |
| 305 if (IsPromise(x) && x.constructor === GlobalPromise) return x; |
| 306 return PromiseCreateAndSet(+1, x); |
| 307 } |
| 308 |
296 // ES#sec-promise.prototype.then | 309 // ES#sec-promise.prototype.then |
297 // Promise.prototype.then ( onFulfilled, onRejected ) | 310 // Promise.prototype.then ( onFulfilled, onRejected ) |
298 // Multi-unwrapped chaining with thenable coercion. | 311 // Multi-unwrapped chaining with thenable coercion. |
299 function PromiseThen(onResolve, onReject) { | 312 function PromiseThen(onResolve, onReject) { |
300 var status = GET_PRIVATE(this, promiseStateSymbol); | 313 var status = GET_PRIVATE(this, promiseStateSymbol); |
301 if (IS_UNDEFINED(status)) { | 314 if (IS_UNDEFINED(status)) { |
302 throw MakeTypeError(kNotAPromise, this); | 315 throw MakeTypeError(kNotAPromise, this); |
303 } | 316 } |
304 | 317 |
305 var constructor = SpeciesConstructor(this, GlobalPromise); | 318 var constructor = SpeciesConstructor(this, GlobalPromise); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 ]); | 493 ]); |
481 | 494 |
482 %InstallToContext([ | 495 %InstallToContext([ |
483 "promise_catch", PromiseCatch, | 496 "promise_catch", PromiseCatch, |
484 "promise_chain", PromiseChain, | 497 "promise_chain", PromiseChain, |
485 "promise_create", PromiseCreate, | 498 "promise_create", PromiseCreate, |
486 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, | 499 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, |
487 "promise_reject", RejectPromise, | 500 "promise_reject", RejectPromise, |
488 "promise_resolve", FulfillPromise, | 501 "promise_resolve", FulfillPromise, |
489 "promise_then", PromiseThen, | 502 "promise_then", PromiseThen, |
| 503 "promise_create_rejected", PromiseCreateRejected, |
| 504 "promise_create_resolved", PromiseCreateResolved |
490 ]); | 505 ]); |
491 | 506 |
492 // This allows extras to create promises quickly without building extra | 507 // This allows extras to create promises quickly without building extra |
493 // resolve/reject closures, and allows them to later resolve and reject any | 508 // resolve/reject closures, and allows them to later resolve and reject any |
494 // promise without having to hold on to those closures forever. | 509 // promise without having to hold on to those closures forever. |
495 utils.InstallFunctions(extrasUtils, 0, [ | 510 utils.InstallFunctions(extrasUtils, 0, [ |
496 "createPromise", PromiseCreate, | 511 "createPromise", PromiseCreate, |
497 "resolvePromise", FulfillPromise, | 512 "resolvePromise", FulfillPromise, |
498 "rejectPromise", RejectPromise | 513 "rejectPromise", RejectPromise |
499 ]); | 514 ]); |
500 | 515 |
501 // TODO(v8:4567): Allow experimental natives to remove function prototype | 516 // TODO(v8:4567): Allow experimental natives to remove function prototype |
502 [PromiseChain, PromiseDefer, PromiseAccept].forEach( | 517 [PromiseChain, PromiseDefer, PromiseAccept].forEach( |
503 fn => %FunctionRemovePrototype(fn)); | 518 fn => %FunctionRemovePrototype(fn)); |
504 | 519 |
505 utils.Export(function(to) { | 520 utils.Export(function(to) { |
506 to.PromiseChain = PromiseChain; | 521 to.PromiseChain = PromiseChain; |
507 to.PromiseDefer = PromiseDefer; | 522 to.PromiseDefer = PromiseDefer; |
508 to.PromiseAccept = PromiseAccept; | 523 to.PromiseAccept = PromiseAccept; |
| 524 |
| 525 to.PromiseCreateRejected = PromiseCreateRejected; |
| 526 to.PromiseCreateResolved = PromiseCreateResolved; |
| 527 to.PromiseThen = PromiseThen; |
509 }); | 528 }); |
510 | 529 |
511 }) | 530 }) |
OLD | NEW |