]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGFrozenValue.h
2 * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef DFGFrozenValue_h
27 #define DFGFrozenValue_h
31 #include "DFGValueStrength.h"
33 #include "JSCJSValue.h"
34 #include "Structure.h"
36 namespace JSC
{ namespace DFG
{
43 : m_structure(nullptr)
44 , m_strength(WeakValue
)
48 FrozenValue(JSValue value
)
50 , m_structure(nullptr)
51 , m_strength(WeakValue
)
53 RELEASE_ASSERT(!value
|| !value
.isCell());
56 FrozenValue(JSValue value
, Structure
* structure
, ValueStrength strength
)
58 , m_structure(structure
)
59 , m_strength(strength
)
61 ASSERT((!!value
&& value
.isCell()) == !!structure
);
62 ASSERT(!value
|| !value
.isCell() || value
.asCell()->classInfo() == structure
->classInfo());
63 ASSERT(!!structure
|| (strength
== WeakValue
));
66 static FrozenValue
* emptySingleton();
68 bool operator!() const { return !m_value
; }
70 JSValue
value() const { return m_value
; }
71 JSCell
* cell() const { return m_value
.asCell(); }
76 return jsDynamicCast
<T
>(value());
81 return jsCast
<T
>(value());
84 Structure
* structure() const { return m_structure
; }
86 void strengthenTo(ValueStrength strength
)
88 if (!!m_value
&& m_value
.isCell())
89 m_strength
= merge(m_strength
, strength
);
92 bool pointsToHeap() const { return !!value() && value().isCell(); }
94 // The strength of the value itself. The structure is almost always weak.
95 ValueStrength
strength() const { return m_strength
; }
97 void dumpInContext(PrintStream
& out
, DumpContext
* context
) const;
98 void dump(PrintStream
& out
) const;
103 // This is a utility method for DFG::Graph::freeze(). You should almost always call
104 // Graph::freeze() directly. Calling this instead of Graph::freeze() can result in
105 // the same constant being viewed as having different structures during the course
106 // of compilation, which can sometimes cause bad things to happen. For example, we
107 // may observe that one version of the constant has an unwatchable structure but
108 // then a later version may start to have a watchable structure due to a transition.
109 // The point of freezing is to ensure that we generally only see one version of
110 // constants, but that requires freezing through the Graph.
111 static FrozenValue
freeze(JSValue value
)
115 (!!value
&& value
.isCell()) ? value
.asCell()->structure() : nullptr,
120 Structure
* m_structure
;
121 ValueStrength m_strength
;
124 } } // namespace JSC::DFG
126 #endif // ENABLE(DFG_JIT)
128 #endif // DFGFrozenValue_h