Remove excessive headers from JavaScriptCore
[WebKit-https.git] / Source / JavaScriptCore / bytecode / MethodOfGettingAValueProfile.h
1 /*
2  * Copyright (C) 2012, 2016 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 #pragma once
27
28 // This is guarded by ENABLE_DFG_JIT only because it uses some value profiles
29 // that are currently only used if the DFG is enabled (i.e. they are not
30 // available in the profile-only configuration). Hopefully someday all of
31 // these #if's will disappear...
32 #if ENABLE(DFG_JIT)
33
34 #include "GPRInfo.h"
35
36 namespace JSC {
37
38 class CCallHelpers;
39 class CodeBlock;
40 class LazyOperandValueProfileKey;
41 struct ArithProfile;
42 struct ValueProfile;
43
44 class MethodOfGettingAValueProfile {
45 public:
46     MethodOfGettingAValueProfile()
47         : m_kind(None)
48     {
49     }
50     
51     MethodOfGettingAValueProfile(ValueProfile* profile)
52     {
53         if (profile) {
54             m_kind = Ready;
55             u.profile = profile;
56         } else
57             m_kind = None;
58     }
59     
60     MethodOfGettingAValueProfile(ArithProfile* profile)
61     {
62         if (profile) {
63             m_kind = ArithProfileReady;
64             u.arithProfile = profile;
65         } else
66             m_kind = None;
67     }
68     
69     static MethodOfGettingAValueProfile fromLazyOperand(
70         CodeBlock*, const LazyOperandValueProfileKey&);
71     
72     explicit operator bool() const { return m_kind != None; }
73     
74     void emitReportValue(CCallHelpers&, JSValueRegs) const;
75     
76 private:
77     enum Kind {
78         None,
79         Ready,
80         ArithProfileReady,
81         LazyOperand
82     };
83     
84     Kind m_kind;
85     union {
86         ValueProfile* profile;
87         ArithProfile* arithProfile;
88         struct {
89             CodeBlock* codeBlock;
90             unsigned bytecodeOffset;
91             int operand;
92         } lazyOperand;
93     } u;
94 };
95
96 } // namespace JSC
97
98 #endif // ENABLE(DFG_JIT)