diff options
Diffstat (limited to 'deps/v8/src/objects/js-promise.h')
-rw-r--r-- | deps/v8/src/objects/js-promise.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/deps/v8/src/objects/js-promise.h b/deps/v8/src/objects/js-promise.h new file mode 100644 index 0000000000..b454084b8e --- /dev/null +++ b/deps/v8/src/objects/js-promise.h @@ -0,0 +1,105 @@ +// Copyright 2018 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_OBJECTS_JS_PROMISE_H_ +#define V8_OBJECTS_JS_PROMISE_H_ + +#include "src/objects.h" +#include "src/objects/promise.h" + +// Has to be the last include (doesn't have include guards): +#include "src/objects/object-macros.h" + +namespace v8 { +namespace internal { + +// Representation of promise objects in the specification. Our layout of +// JSPromise differs a bit from the layout in the specification, for example +// there's only a single list of PromiseReaction objects, instead of separate +// lists for fulfill and reject reactions. The PromiseReaction carries both +// callbacks from the start, and is eventually morphed into the proper kind of +// PromiseReactionJobTask when the JSPromise is settled. +// +// We also overlay the result and reactions fields on the JSPromise, since +// the reactions are only necessary for pending promises, whereas the result +// is only meaningful for settled promises. +class JSPromise : public JSObject { + public: + // [reactions_or_result]: Smi 0 terminated list of PromiseReaction objects + // in case the JSPromise was not settled yet, otherwise the result. + DECL_ACCESSORS(reactions_or_result, Object) + + // [result]: Checks that the promise is settled and returns the result. + inline Object* result() const; + + // [reactions]: Checks that the promise is pending and returns the reactions. + inline Object* reactions() const; + + DECL_INT_ACCESSORS(flags) + + // [has_handler]: Whether this promise has a reject handler or not. + DECL_BOOLEAN_ACCESSORS(has_handler) + + // [handled_hint]: Whether this promise will be handled by a catch + // block in an async function. + DECL_BOOLEAN_ACCESSORS(handled_hint) + + static const char* Status(Promise::PromiseState status); + Promise::PromiseState status() const; + void set_status(Promise::PromiseState status); + + // ES section #sec-fulfillpromise + static Handle<Object> Fulfill(Handle<JSPromise> promise, + Handle<Object> value); + // ES section #sec-rejectpromise + static Handle<Object> Reject(Handle<JSPromise> promise, Handle<Object> reason, + bool debug_event = true); + // ES section #sec-promise-resolve-functions + MUST_USE_RESULT static MaybeHandle<Object> Resolve(Handle<JSPromise> promise, + Handle<Object> resolution); + + // This is a helper that extracts the JSPromise from the input + // {object}, which is used as a payload for PromiseReaction and + // PromiseReactionJobTask. + MUST_USE_RESULT static MaybeHandle<JSPromise> From(Handle<HeapObject> object); + + DECL_CAST(JSPromise) + + // Dispatched behavior. + DECL_PRINTER(JSPromise) + DECL_VERIFIER(JSPromise) + + // Layout description. + static const int kReactionsOrResultOffset = JSObject::kHeaderSize; + static const int kFlagsOffset = kReactionsOrResultOffset + kPointerSize; + static const int kSize = kFlagsOffset + kPointerSize; + static const int kSizeWithEmbedderFields = + kSize + v8::Promise::kEmbedderFieldCount * kPointerSize; + + // Flags layout. + // The first two bits store the v8::Promise::PromiseState. + static const int kStatusBits = 2; + static const int kHasHandlerBit = 2; + static const int kHandledHintBit = 3; + + static const int kStatusShift = 0; + static const int kStatusMask = 0x3; + STATIC_ASSERT(v8::Promise::kPending == 0); + STATIC_ASSERT(v8::Promise::kFulfilled == 1); + STATIC_ASSERT(v8::Promise::kRejected == 2); + + private: + // ES section #sec-triggerpromisereactions + static Handle<Object> TriggerPromiseReactions(Isolate* isolate, + Handle<Object> reactions, + Handle<Object> argument, + PromiseReaction::Type type); +}; + +} // namespace internal +} // namespace v8 + +#include "src/objects/object-macros-undef.h" + +#endif // V8_OBJECTS_JS_PROMISE_H_ |