06c072bcd887813ef51bc24863d5ad474bb9dfcf
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSAsyncGeneratorFunction.h
1 /*
2  * Copyright (C) 2017 Oleksandr Skachkov <gskachkov@gmail.com>.
3  * Copyright (C) 2018 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #pragma once
28
29 #include "JSFunction.h"
30
31 namespace JSC {
32
33 class JSAsyncGeneratorFunction final : public JSFunction {
34     friend class JIT;
35     friend class VM;
36 public:
37     using Base = JSFunction;
38
39     const static unsigned StructureFlags = Base::StructureFlags;
40
41     template<typename CellType>
42     static IsoSubspace* subspaceFor(VM& vm)
43     {
44         return &vm.functionSpace;
45     }
46
47     DECLARE_EXPORT_INFO;
48
49     static JSAsyncGeneratorFunction* create(VM&, FunctionExecutable*, JSScope*);
50     static JSAsyncGeneratorFunction* create(VM&, FunctionExecutable*, JSScope*, Structure*);
51     static JSAsyncGeneratorFunction* createWithInvalidatedReallocationWatchpoint(VM&, FunctionExecutable*, JSScope*);
52
53     static size_t allocationSize(size_t inlineCapacity)
54     {
55         ASSERT_UNUSED(inlineCapacity, !inlineCapacity);
56         return sizeof(JSAsyncGeneratorFunction);
57     }
58
59     static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
60     {
61         ASSERT(globalObject);
62         return Structure::create(vm, globalObject, prototype, TypeInfo(JSFunctionType, StructureFlags), info());
63     }
64
65     enum class AsyncGeneratorState : int32_t {
66         Completed = -1,
67         Executing = -2,
68         SuspendedStart = -3,
69         SuspendedYield = -4,
70         AwaitingReturn = -5
71     };
72     
73     enum class AsyncGeneratorSuspendReason : int32_t {
74         None = 0,
75         Yield = -1,
76         Await = -2
77     };
78 private:
79     JSAsyncGeneratorFunction(VM&, FunctionExecutable*, JSScope*, Structure*);
80
81     static JSAsyncGeneratorFunction* createImpl(VM&, FunctionExecutable*, JSScope*, Structure*);
82 };
83 static_assert(sizeof(JSAsyncGeneratorFunction) == sizeof(JSFunction), "Some subclasses of JSFunction should be the same size to share IsoSubspace");
84
85 } // namespace JSC