CodeBlock compilation and installation should be simplified and rationalized
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGPlan.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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef DFGPlan_h
27 #define DFGPlan_h
28
29 #include <wtf/Platform.h>
30
31 #include "CompilationResult.h"
32 #include "DFGDesiredIdentifiers.h"
33 #include "DFGDesiredStructureChains.h"
34 #include "DFGDesiredTransitions.h"
35 #include "DFGDesiredWatchpoints.h"
36 #include "DFGDesiredWeakReferences.h"
37 #include "DFGDesiredWriteBarriers.h"
38 #include "DFGFinalizer.h"
39 #include "DeferredCompilationCallback.h"
40 #include "Operands.h"
41 #include "ProfilerCompilation.h"
42 #include <wtf/ThreadSafeRefCounted.h>
43
44 namespace JSC {
45
46 class CodeBlock;
47
48 namespace DFG {
49
50 class LongLivedState;
51
52 #if ENABLE(DFG_JIT)
53
54 struct Plan : public ThreadSafeRefCounted<Plan> {
55     Plan(
56         PassRefPtr<CodeBlock>, unsigned osrEntryBytecodeIndex, unsigned numVarsWithValues);
57     ~Plan();
58     
59     void compileInThread(LongLivedState&);
60     
61     CompilationResult finalizeWithoutNotifyingCallback();
62     void finalizeAndNotifyCallback();
63     
64     void notifyReady();
65     
66     CodeBlock* key();
67     
68     VM& vm;
69     RefPtr<CodeBlock> codeBlock;
70     const unsigned osrEntryBytecodeIndex;
71     const unsigned numVarsWithValues;
72     Operands<JSValue> mustHandleValues;
73
74     RefPtr<Profiler::Compilation> compilation;
75
76     OwnPtr<Finalizer> finalizer;
77     
78     DesiredWatchpoints watchpoints;
79     DesiredIdentifiers identifiers;
80     DesiredStructureChains chains;
81     DesiredWeakReferences weakReferences;
82     DesiredWriteBarriers writeBarriers;
83     DesiredTransitions transitions;
84
85     double beforeFTL;
86     
87     bool isCompiled;
88
89     RefPtr<DeferredCompilationCallback> callback;
90
91 private:
92     enum CompilationPath { FailPath, DFGPath, FTLPath };
93     CompilationPath compileInThreadImpl(LongLivedState&);
94     
95     bool isStillValid();
96     void reallyAdd(CommonData*);
97 };
98
99 #else // ENABLE(DFG_JIT)
100
101 class Plan : public RefCounted<Plan> {
102     // Dummy class to allow !ENABLE(DFG_JIT) to build.
103 };
104
105 #endif // ENABLE(DFG_JIT)
106
107 } } // namespace JSC::DFG
108
109 #endif // DFGPlan_h
110