d5ec0e06f3a31bedbb3e9aef79bf4454fd147cc9
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGMultiGetByOffsetData.h
1 /*
2  * Copyright (C) 2015 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 #if ENABLE(DFG_JIT)
29
30 #include "DFGRegisteredStructureSet.h"
31 #include "DumpContext.h"
32 #include "JSObject.h"
33 #include "StructureSet.h"
34
35 namespace JSC { namespace DFG {
36
37 class FrozenValue;
38
39 class GetByOffsetMethod {
40 public:
41     enum Kind {
42         Invalid,
43         // Constant might mean either that we have some fixed property or that the
44         // property is unset and we know the result is undefined. We don't distingish
45         // between these cases because no one cares about this distintion yet.
46         Constant,
47         Load,
48         LoadFromPrototype
49     };
50     
51     GetByOffsetMethod()
52         : m_kind(Invalid)
53     {
54     }
55     
56     static GetByOffsetMethod constant(FrozenValue* value)
57     {
58         GetByOffsetMethod result;
59         result.m_kind = Constant;
60         result.u.constant = value;
61         return result;
62     }
63     
64     static GetByOffsetMethod load(PropertyOffset offset)
65     {
66         GetByOffsetMethod result;
67         result.m_kind = Load;
68         result.u.load.offset = offset;
69         return result;
70     }
71     
72     static GetByOffsetMethod loadFromPrototype(FrozenValue* prototype, PropertyOffset offset)
73     {
74         GetByOffsetMethod result;
75         result.m_kind = LoadFromPrototype;
76         result.u.load.prototype = prototype;
77         result.u.load.offset = offset;
78         return result;
79     }
80     
81     bool operator!() const { return m_kind == Invalid; }
82     
83     Kind kind() const { return m_kind; }
84     
85     FrozenValue* constant() const
86     {
87         ASSERT(kind() == Constant);
88         return u.constant;
89     }
90     
91     FrozenValue* prototype() const
92     {
93         ASSERT(kind() == LoadFromPrototype);
94         return u.load.prototype;
95     }
96     
97     PropertyOffset offset() const
98     {
99         ASSERT(kind() == Load || kind() == LoadFromPrototype);
100         return u.load.offset;
101     }
102     
103     void dumpInContext(PrintStream&, DumpContext*) const;
104     void dump(PrintStream&) const;
105     
106 private:
107     union {
108         FrozenValue* constant;
109         struct {
110             FrozenValue* prototype;
111             PropertyOffset offset;
112         } load;
113     } u;
114     Kind m_kind;
115 };
116
117 class MultiGetByOffsetCase {
118 public:
119     MultiGetByOffsetCase()
120     {
121     }
122     
123     MultiGetByOffsetCase(const RegisteredStructureSet& set, const GetByOffsetMethod& method)
124         : m_set(set)
125         , m_method(method)
126     {
127     }
128     
129     RegisteredStructureSet& set() { return m_set; }
130     const RegisteredStructureSet& set() const { return m_set; }
131     const GetByOffsetMethod& method() const { return m_method; }
132     
133     void dumpInContext(PrintStream&, DumpContext*) const;
134     void dump(PrintStream&) const;
135
136 private:
137     RegisteredStructureSet m_set;
138     GetByOffsetMethod m_method;
139 };
140
141 struct MultiGetByOffsetData {
142     unsigned identifierNumber;
143     Vector<MultiGetByOffsetCase, 2> cases;
144 };
145
146 } } // namespace JSC::DFG
147
148 namespace WTF {
149
150 void printInternal(PrintStream&, JSC::DFG::GetByOffsetMethod::Kind);
151
152 } // namespace WTF
153
154 #endif // ENABLE(DFG_JIT)