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 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 result.resolve = resolve; | 339 result.resolve = resolve; |
340 result.reject = reject; | 340 result.reject = reject; |
341 }); | 341 }); |
342 | 342 |
343 if (!IS_CALLABLE(result.resolve) || !IS_CALLABLE(result.reject)) | 343 if (!IS_CALLABLE(result.resolve) || !IS_CALLABLE(result.reject)) |
344 throw %make_type_error(kPromiseNonCallable); | 344 throw %make_type_error(kPromiseNonCallable); |
345 | 345 |
346 return result; | 346 return result; |
347 } | 347 } |
348 | 348 |
349 // Unspecified V8-specific legacy function | |
350 function PromiseDefer() { | |
351 %IncrementUseCounter(kPromiseDefer); | |
352 return NewPromiseCapability(this); | |
353 } | |
354 | |
355 // Unspecified V8-specific legacy function | |
356 function PromiseAccept(x) { | |
357 %IncrementUseCounter(kPromiseAccept); | |
358 return %_Call(PromiseResolve, this, x); | |
359 } | |
360 | |
361 // ES#sec-promise.reject | 349 // ES#sec-promise.reject |
362 // Promise.reject ( x ) | 350 // Promise.reject ( x ) |
363 function PromiseReject(r) { | 351 function PromiseReject(r) { |
364 if (!IS_RECEIVER(this)) { | 352 if (!IS_RECEIVER(this)) { |
365 throw %make_type_error(kCalledOnNonObject, PromiseResolve); | 353 throw %make_type_error(kCalledOnNonObject, PromiseResolve); |
366 } | 354 } |
367 if (this === GlobalPromise) { | 355 if (this === GlobalPromise) { |
368 // Optimized case, avoid extra closure. | 356 // Optimized case, avoid extra closure. |
369 var promise = PromiseCreateAndSet(kRejected, r); | 357 var promise = PromiseCreateAndSet(kRejected, r); |
370 // The debug event for this would always be an uncaught promise reject, | 358 // The debug event for this would always be an uncaught promise reject, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 var status = GET_PRIVATE(this, promiseStateSymbol); | 424 var status = GET_PRIVATE(this, promiseStateSymbol); |
437 if (IS_UNDEFINED(status)) { | 425 if (IS_UNDEFINED(status)) { |
438 throw %make_type_error(kNotAPromise, this); | 426 throw %make_type_error(kNotAPromise, this); |
439 } | 427 } |
440 | 428 |
441 var constructor = SpeciesConstructor(this, GlobalPromise); | 429 var constructor = SpeciesConstructor(this, GlobalPromise); |
442 var resultCapability = NewPromiseCapability(constructor); | 430 var resultCapability = NewPromiseCapability(constructor); |
443 return PerformPromiseThen(this, onResolve, onReject, resultCapability); | 431 return PerformPromiseThen(this, onResolve, onReject, resultCapability); |
444 } | 432 } |
445 | 433 |
446 // Unspecified V8-specific legacy function | |
447 // Chain is left around for now as an alias for then | |
448 function PromiseChain(onResolve, onReject) { | |
449 %IncrementUseCounter(kPromiseChain); | |
450 return %_Call(PromiseThen, this, onResolve, onReject); | |
451 } | |
452 | |
453 // ES#sec-promise.prototype.catch | 434 // ES#sec-promise.prototype.catch |
454 // Promise.prototype.catch ( onRejected ) | 435 // Promise.prototype.catch ( onRejected ) |
455 function PromiseCatch(onReject) { | 436 function PromiseCatch(onReject) { |
456 return this.then(UNDEFINED, onReject); | 437 return this.then(UNDEFINED, onReject); |
457 } | 438 } |
458 | 439 |
459 // Combinators. | 440 // Combinators. |
460 | 441 |
461 // ES#sec-promise.resolve | 442 // ES#sec-promise.resolve |
462 // Promise.resolve ( x ) | 443 // Promise.resolve ( x ) |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 | 589 |
609 utils.InstallGetter(GlobalPromise, speciesSymbol, PromiseSpecies); | 590 utils.InstallGetter(GlobalPromise, speciesSymbol, PromiseSpecies); |
610 | 591 |
611 utils.InstallFunctions(GlobalPromise.prototype, DONT_ENUM, [ | 592 utils.InstallFunctions(GlobalPromise.prototype, DONT_ENUM, [ |
612 "then", PromiseThen, | 593 "then", PromiseThen, |
613 "catch", PromiseCatch | 594 "catch", PromiseCatch |
614 ]); | 595 ]); |
615 | 596 |
616 %InstallToContext([ | 597 %InstallToContext([ |
617 "promise_catch", PromiseCatch, | 598 "promise_catch", PromiseCatch, |
618 "promise_chain", PromiseChain, | |
619 "promise_create", PromiseCreate, | 599 "promise_create", PromiseCreate, |
620 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, | 600 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, |
621 "promise_reject", RejectPromise, | 601 "promise_reject", RejectPromise, |
622 "promise_resolve", ResolvePromise, | 602 "promise_resolve", ResolvePromise, |
623 "promise_then", PromiseThen, | 603 "promise_then", PromiseThen, |
624 "promise_create_rejected", PromiseCreateRejected, | 604 "promise_create_rejected", PromiseCreateRejected, |
625 "promise_create_resolved", PromiseCreateResolved | 605 "promise_create_resolved", PromiseCreateResolved |
626 ]); | 606 ]); |
627 | 607 |
628 // This allows extras to create promises quickly without building extra | 608 // This allows extras to create promises quickly without building extra |
629 // resolve/reject closures, and allows them to later resolve and reject any | 609 // resolve/reject closures, and allows them to later resolve and reject any |
630 // promise without having to hold on to those closures forever. | 610 // promise without having to hold on to those closures forever. |
631 utils.InstallFunctions(extrasUtils, 0, [ | 611 utils.InstallFunctions(extrasUtils, 0, [ |
632 "createPromise", PromiseCreate, | 612 "createPromise", PromiseCreate, |
633 "resolvePromise", ResolvePromise, | 613 "resolvePromise", ResolvePromise, |
634 "rejectPromise", RejectPromise | 614 "rejectPromise", RejectPromise |
635 ]); | 615 ]); |
636 | 616 |
637 // TODO(v8:4567): Allow experimental natives to remove function prototype | |
638 [PromiseChain, PromiseDefer, PromiseAccept].forEach( | |
639 fn => %FunctionRemovePrototype(fn)); | |
640 | |
641 utils.Export(function(to) { | 617 utils.Export(function(to) { |
642 to.PromiseChain = PromiseChain; | |
643 to.PromiseDefer = PromiseDefer; | |
644 to.PromiseAccept = PromiseAccept; | |
645 | |
646 to.PromiseCastResolved = PromiseCastResolved; | 618 to.PromiseCastResolved = PromiseCastResolved; |
647 to.PromiseThen = PromiseThen; | 619 to.PromiseThen = PromiseThen; |
648 | 620 |
649 to.GlobalPromise = GlobalPromise; | 621 to.GlobalPromise = GlobalPromise; |
650 to.NewPromiseCapability = NewPromiseCapability; | 622 to.NewPromiseCapability = NewPromiseCapability; |
651 to.PerformPromiseThen = PerformPromiseThen; | 623 to.PerformPromiseThen = PerformPromiseThen; |
652 }); | 624 }); |
653 | 625 |
654 }) | 626 }) |
OLD | NEW |