OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/builtins/builtins-promise.h" | 5 #include "src/builtins/builtins-promise.h" |
6 #include "src/builtins/builtins-utils.h" | 6 #include "src/builtins/builtins-utils.h" |
7 #include "src/builtins/builtins.h" | 7 #include "src/builtins/builtins.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stub-assembler.h" | 9 #include "src/code-stub-assembler.h" |
10 #include "src/promise-utils.h" | 10 #include "src/promise-utils.h" |
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 | 665 |
666 Node* const executor_map = LoadMap(executor); | 666 Node* const executor_map = LoadMap(executor); |
667 GotoUnless(IsCallableMap(executor_map), &if_notcallable); | 667 GotoUnless(IsCallableMap(executor_map), &if_notcallable); |
668 | 668 |
669 Node* const native_context = LoadNativeContext(context); | 669 Node* const native_context = LoadNativeContext(context); |
670 Node* const promise_fun = | 670 Node* const promise_fun = |
671 LoadContextElement(native_context, Context::PROMISE_FUNCTION_INDEX); | 671 LoadContextElement(native_context, Context::PROMISE_FUNCTION_INDEX); |
672 Node* const is_debug_active = IsDebugActive(); | 672 Node* const is_debug_active = IsDebugActive(); |
673 Label if_targetisnotmodified(this), | 673 Label if_targetisnotmodified(this), |
674 if_targetismodified(this, Label::kDeferred), run_executor(this), | 674 if_targetismodified(this, Label::kDeferred), run_executor(this), |
675 debug_push(this, Label::kDeferred), init(this); | 675 debug_push(this), init(this); |
676 | 676 |
677 Branch(WordEqual(promise_fun, new_target), &if_targetisnotmodified, | 677 Branch(WordEqual(promise_fun, new_target), &if_targetisnotmodified, |
678 &if_targetismodified); | 678 &if_targetismodified); |
679 | 679 |
680 Variable var_result(this, MachineRepresentation::kTagged), | 680 Variable var_result(this, MachineRepresentation::kTagged), |
681 var_reject_call(this, MachineRepresentation::kTagged), | 681 var_reject_call(this, MachineRepresentation::kTagged), |
682 var_reason(this, MachineRepresentation::kTagged); | 682 var_reason(this, MachineRepresentation::kTagged); |
683 | 683 |
684 Bind(&if_targetisnotmodified); | 684 Bind(&if_targetisnotmodified); |
685 { | 685 { |
686 Node* const instance = AllocateJSPromise(context); | 686 Node* const instance = AllocateJSPromise(context); |
687 var_result.Bind(instance); | 687 var_result.Bind(instance); |
688 GotoUnless(IsPromiseHookEnabled(), &init); | |
689 CallRuntime(Runtime::kPromiseHookInit, context, instance, | |
690 UndefinedConstant()); | |
691 Goto(&init); | 688 Goto(&init); |
692 } | 689 } |
693 | 690 |
694 Bind(&if_targetismodified); | 691 Bind(&if_targetismodified); |
695 { | 692 { |
696 Callable fast_new_object_stub = CodeFactory::FastNewObject(isolate); | 693 Callable fast_new_object_stub = CodeFactory::FastNewObject(isolate); |
697 Node* const instance = | 694 Node* const instance = |
698 CallStub(fast_new_object_stub, context, promise_fun, new_target); | 695 CallStub(fast_new_object_stub, context, promise_fun, new_target); |
699 | 696 |
700 var_result.Bind(instance); | 697 var_result.Bind(instance); |
701 Goto(&init); | 698 Goto(&init); |
702 } | 699 } |
703 | 700 |
704 Bind(&init); | 701 Bind(&init); |
705 { | 702 { |
706 PromiseInit(var_result.value()); | 703 PromiseInit(var_result.value()); |
707 Branch(is_debug_active, &debug_push, &run_executor); | 704 GotoUnless(IsPromiseHookEnabled(), &debug_push); |
| 705 CallRuntime(Runtime::kPromiseHookInit, context, var_result.value(), |
| 706 UndefinedConstant()); |
| 707 Goto(&debug_push); |
708 } | 708 } |
709 | 709 |
710 Bind(&debug_push); | 710 Bind(&debug_push); |
711 { | 711 { |
| 712 GotoUnless(is_debug_active, &run_executor); |
712 CallRuntime(Runtime::kDebugPushPromise, context, var_result.value()); | 713 CallRuntime(Runtime::kDebugPushPromise, context, var_result.value()); |
713 Goto(&run_executor); | 714 Goto(&run_executor); |
714 } | 715 } |
715 | 716 |
716 Bind(&run_executor); | 717 Bind(&run_executor); |
717 { | 718 { |
718 Label out(this), if_rejectpromise(this), debug_pop(this, Label::kDeferred); | 719 Label out(this), if_rejectpromise(this), debug_pop(this, Label::kDeferred); |
719 | 720 |
720 Node *resolve, *reject; | 721 Node *resolve, *reject; |
721 std::tie(resolve, reject) = CreatePromiseResolvingFunctions( | 722 std::tie(resolve, reject) = CreatePromiseResolvingFunctions( |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 CallStub(getproperty_callable, context, promise, then_str); | 1031 CallStub(getproperty_callable, context, promise, then_str); |
1031 Callable call_callable = CodeFactory::Call(isolate); | 1032 Callable call_callable = CodeFactory::Call(isolate); |
1032 Node* const result = | 1033 Node* const result = |
1033 CallJS(call_callable, context, then, promise, on_resolve, on_reject); | 1034 CallJS(call_callable, context, then, promise, on_resolve, on_reject); |
1034 Return(result); | 1035 Return(result); |
1035 } | 1036 } |
1036 } | 1037 } |
1037 | 1038 |
1038 } // namespace internal | 1039 } // namespace internal |
1039 } // namespace v8 | 1040 } // namespace v8 |
OLD | NEW |