| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_BUILTINS_BUILTINS_PROMISE_H_ | |
| 6 #define V8_BUILTINS_BUILTINS_PROMISE_H_ | |
| 7 | |
| 8 #include "src/code-stub-assembler.h" | |
| 9 #include "src/contexts.h" | |
| 10 | |
| 11 namespace v8 { | |
| 12 namespace internal { | |
| 13 | |
| 14 typedef compiler::CodeAssemblerState CodeAssemblerState; | |
| 15 | |
| 16 class PromiseBuiltinsAssembler : public CodeStubAssembler { | |
| 17 public: | |
| 18 enum PromiseResolvingFunctionContextSlot { | |
| 19 // Whether the resolve/reject callback was already called. | |
| 20 kAlreadyVisitedSlot = Context::MIN_CONTEXT_SLOTS, | |
| 21 | |
| 22 // The promise which resolve/reject callbacks fulfill. | |
| 23 kPromiseSlot, | |
| 24 | |
| 25 // Whether to trigger a debug event or not. Used in catch | |
| 26 // prediction. | |
| 27 kDebugEventSlot, | |
| 28 kPromiseContextLength, | |
| 29 }; | |
| 30 | |
| 31 enum FunctionContextSlot { | |
| 32 kCapabilitySlot = Context::MIN_CONTEXT_SLOTS, | |
| 33 | |
| 34 kCapabilitiesContextLength, | |
| 35 }; | |
| 36 | |
| 37 // This is used by the PromiseThenFinally and PromiseCatchFinally | |
| 38 // builtins to store the onFinally in the onFinallySlot. | |
| 39 // | |
| 40 // This is also used by the PromiseValueThunkFinally to store the | |
| 41 // value in the onFinallySlot and PromiseThrowerFinally to store the | |
| 42 // reason in the onFinallySlot. | |
| 43 enum PromiseFinallyContextSlot { | |
| 44 kOnFinallySlot = Context::MIN_CONTEXT_SLOTS, | |
| 45 | |
| 46 kOnFinallyContextLength, | |
| 47 }; | |
| 48 | |
| 49 explicit PromiseBuiltinsAssembler(compiler::CodeAssemblerState* state) | |
| 50 : CodeStubAssembler(state) {} | |
| 51 // These allocate and initialize a promise with pending state and | |
| 52 // undefined fields. | |
| 53 // | |
| 54 // This uses undefined as the parent promise for the promise init | |
| 55 // hook. | |
| 56 Node* AllocateAndInitJSPromise(Node* context); | |
| 57 // This uses the given parent as the parent promise for the promise | |
| 58 // init hook. | |
| 59 Node* AllocateAndInitJSPromise(Node* context, Node* parent); | |
| 60 | |
| 61 // This allocates and initializes a promise with the given state and | |
| 62 // fields. | |
| 63 Node* AllocateAndSetJSPromise(Node* context, Node* status, Node* result); | |
| 64 | |
| 65 Node* AllocatePromiseResolveThenableJobInfo(Node* result, Node* then, | |
| 66 Node* resolve, Node* reject, | |
| 67 Node* context); | |
| 68 | |
| 69 std::pair<Node*, Node*> CreatePromiseResolvingFunctions( | |
| 70 Node* promise, Node* native_context, Node* promise_context); | |
| 71 | |
| 72 Node* PromiseHasHandler(Node* promise); | |
| 73 | |
| 74 Node* CreatePromiseResolvingFunctionsContext(Node* promise, Node* debug_event, | |
| 75 Node* native_context); | |
| 76 | |
| 77 Node* CreatePromiseGetCapabilitiesExecutorContext(Node* native_context, | |
| 78 Node* promise_capability); | |
| 79 | |
| 80 Node* NewPromiseCapability(Node* context, Node* constructor, | |
| 81 Node* debug_event = nullptr); | |
| 82 | |
| 83 protected: | |
| 84 void PromiseInit(Node* promise); | |
| 85 | |
| 86 Node* ThrowIfNotJSReceiver(Node* context, Node* value, | |
| 87 MessageTemplate::Template msg_template, | |
| 88 const char* method_name = nullptr); | |
| 89 | |
| 90 Node* SpeciesConstructor(Node* context, Node* object, | |
| 91 Node* default_constructor); | |
| 92 | |
| 93 void PromiseSetHasHandler(Node* promise); | |
| 94 void PromiseSetHandledHint(Node* promise); | |
| 95 | |
| 96 void AppendPromiseCallback(int offset, compiler::Node* promise, | |
| 97 compiler::Node* value); | |
| 98 | |
| 99 Node* InternalPromiseThen(Node* context, Node* promise, Node* on_resolve, | |
| 100 Node* on_reject); | |
| 101 | |
| 102 Node* InternalPerformPromiseThen(Node* context, Node* promise, | |
| 103 Node* on_resolve, Node* on_reject, | |
| 104 Node* deferred_promise, | |
| 105 Node* deferred_on_resolve, | |
| 106 Node* deferred_on_reject); | |
| 107 | |
| 108 void InternalResolvePromise(Node* context, Node* promise, Node* result); | |
| 109 | |
| 110 void BranchIfFastPath(Node* context, Node* promise, Label* if_isunmodified, | |
| 111 Label* if_ismodified); | |
| 112 | |
| 113 void BranchIfFastPath(Node* native_context, Node* promise_fun, Node* promise, | |
| 114 Label* if_isunmodified, Label* if_ismodified); | |
| 115 | |
| 116 Node* CreatePromiseContext(Node* native_context, int slots); | |
| 117 void PromiseFulfill(Node* context, Node* promise, Node* result, | |
| 118 v8::Promise::PromiseState status); | |
| 119 | |
| 120 void BranchIfAccessCheckFailed(Node* context, Node* native_context, | |
| 121 Node* promise_constructor, Node* executor, | |
| 122 Label* if_noaccess); | |
| 123 | |
| 124 void InternalPromiseReject(Node* context, Node* promise, Node* value, | |
| 125 bool debug_event); | |
| 126 void InternalPromiseReject(Node* context, Node* promise, Node* value, | |
| 127 Node* debug_event); | |
| 128 std::pair<Node*, Node*> CreatePromiseFinallyFunctions(Node* on_finally, | |
| 129 Node* native_context); | |
| 130 Node* CreatePromiseFinallyContext(Node* on_finally, Node* native_context); | |
| 131 | |
| 132 Node* CreateValueThunkFunction(Node* value, Node* native_context); | |
| 133 Node* CreateValueThunkFunctionContext(Node* value, Node* native_context); | |
| 134 | |
| 135 Node* CreateThrowerFunctionContext(Node* reason, Node* native_context); | |
| 136 Node* CreateThrowerFunction(Node* reason, Node* native_context); | |
| 137 | |
| 138 private: | |
| 139 Node* AllocateJSPromise(Node* context); | |
| 140 }; | |
| 141 | |
| 142 } // namespace internal | |
| 143 } // namespace v8 | |
| 144 | |
| 145 #endif // V8_BUILTINS_BUILTINS_PROMISE_H_ | |
| OLD | NEW |