]> git.saurik.com Git - apple/javascriptcore.git/blame - bytecode/PutByIdStatus.h
JavaScriptCore-1218.34.tar.gz
[apple/javascriptcore.git] / bytecode / PutByIdStatus.h
CommitLineData
6fe7ccc8
A
1/*
2 * Copyright (C) 2012 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 PutByIdStatus_h
27#define PutByIdStatus_h
28
93a37866 29#include "PropertyOffset.h"
6fe7ccc8
A
30#include <wtf/NotFound.h>
31
32namespace JSC {
33
34class CodeBlock;
35class Identifier;
93a37866
A
36class VM;
37class JSGlobalObject;
6fe7ccc8
A
38class Structure;
39class StructureChain;
40
41class PutByIdStatus {
42public:
43 enum State {
44 // It's uncached so we have no information.
45 NoInformation,
46 // It's cached as a direct store into an object property for cases where the object
47 // already has the property.
48 SimpleReplace,
49 // It's cached as a transition from one structure that lacks the property to one that
50 // includes the property, and a direct store to this new property.
51 SimpleTransition,
52 // It's known to often take slow path.
53 TakesSlowPath
54 };
55
56 PutByIdStatus()
57 : m_state(NoInformation)
58 , m_oldStructure(0)
59 , m_newStructure(0)
60 , m_structureChain(0)
93a37866 61 , m_offset(invalidOffset)
6fe7ccc8
A
62 {
63 }
64
93a37866
A
65 explicit PutByIdStatus(State state)
66 : m_state(state)
67 , m_oldStructure(0)
68 , m_newStructure(0)
69 , m_structureChain(0)
70 , m_offset(invalidOffset)
71 {
72 ASSERT(m_state == NoInformation || m_state == TakesSlowPath);
73 }
74
6fe7ccc8
A
75 PutByIdStatus(
76 State state,
77 Structure* oldStructure,
78 Structure* newStructure,
79 StructureChain* structureChain,
93a37866 80 PropertyOffset offset)
6fe7ccc8
A
81 : m_state(state)
82 , m_oldStructure(oldStructure)
83 , m_newStructure(newStructure)
84 , m_structureChain(structureChain)
85 , m_offset(offset)
86 {
87 ASSERT((m_state == NoInformation || m_state == TakesSlowPath) == !m_oldStructure);
88 ASSERT((m_state != SimpleTransition) == !m_newStructure);
89 ASSERT((m_state != SimpleTransition) == !m_structureChain);
93a37866 90 ASSERT((m_state == NoInformation || m_state == TakesSlowPath) == (m_offset == invalidOffset));
6fe7ccc8
A
91 }
92
93 static PutByIdStatus computeFor(CodeBlock*, unsigned bytecodeIndex, Identifier&);
93a37866 94 static PutByIdStatus computeFor(VM&, JSGlobalObject*, Structure*, Identifier&, bool isDirect);
6fe7ccc8
A
95
96 State state() const { return m_state; }
97
98 bool isSet() const { return m_state != NoInformation; }
99 bool operator!() const { return m_state == NoInformation; }
100 bool isSimpleReplace() const { return m_state == SimpleReplace; }
101 bool isSimpleTransition() const { return m_state == SimpleTransition; }
102 bool takesSlowPath() const { return m_state == TakesSlowPath; }
103
104 Structure* oldStructure() const { return m_oldStructure; }
105 Structure* newStructure() const { return m_newStructure; }
106 StructureChain* structureChain() const { return m_structureChain; }
93a37866 107 PropertyOffset offset() const { return m_offset; }
6fe7ccc8
A
108
109private:
110 static PutByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, Identifier&);
111
112 State m_state;
113 Structure* m_oldStructure;
114 Structure* m_newStructure;
115 StructureChain* m_structureChain;
93a37866 116 PropertyOffset m_offset;
6fe7ccc8
A
117};
118
119} // namespace JSC
120
121#endif // PutByIdStatus_h
122