16c2691d80b5ca9364a520e5d0f61c64d52806ef
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSPromise.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "JSInternalFieldObjectImpl.h"
29
30 namespace JSC {
31
32 class JSPromiseConstructor;
33 class JSPromise : public JSInternalFieldObjectImpl<2> {
34 public:
35     using Base = JSInternalFieldObjectImpl<2>;
36
37     template<typename CellType, SubspaceAccess mode>
38     static IsoSubspace* subspaceFor(VM& vm)
39     {
40         return &vm.promiseSpace;
41     }
42
43     JS_EXPORT_PRIVATE static JSPromise* create(VM&, Structure*);
44     static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
45
46     DECLARE_EXPORT_INFO;
47
48     enum class Status : unsigned {
49         Pending = 0, // Making this as 0, so that, we can change the status from Pending to others without masking.
50         Fulfilled = 1,
51         Rejected = 2,
52     };
53     static constexpr uint32_t isHandledFlag = 4;
54     static constexpr uint32_t isFirstResolvingFunctionCalledFlag = 8;
55     static constexpr uint32_t stateMask = 0b11;
56
57     enum class Field : unsigned {
58         Flags = 0,
59         ReactionsOrResult = 1,
60     };
61     static_assert(numberOfInternalFields == 2);
62
63     JS_EXPORT_PRIVATE Status status(VM&) const;
64     JS_EXPORT_PRIVATE JSValue result(VM&) const;
65     JS_EXPORT_PRIVATE bool isHandled(VM&) const;
66
67     JS_EXPORT_PRIVATE static JSPromise* resolvedPromise(JSGlobalObject*, JSValue);
68
69     JS_EXPORT_PRIVATE void resolve(JSGlobalObject*, JSValue);
70     JS_EXPORT_PRIVATE void reject(JSGlobalObject*, JSValue);
71     JS_EXPORT_PRIVATE void reject(JSGlobalObject*, Exception*);
72
73     struct DeferredData {
74         WTF_FORBID_HEAP_ALLOCATION;
75     public:
76         JSPromise* promise { nullptr };
77         JSFunction* resolve { nullptr };
78         JSFunction* reject { nullptr };
79     };
80     static DeferredData createDeferredData(JSGlobalObject*, JSPromiseConstructor*);
81
82     static void visitChildren(JSCell*, SlotVisitor&);
83
84 protected:
85     JSPromise(VM&, Structure*);
86     void finishCreation(VM&);
87
88     uint32_t flags() const;
89 };
90
91 } // namespace JSC