]> git.saurik.com Git - apple/javascriptcore.git/blob - bytecode/PolymorphicGetByIdList.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / bytecode / PolymorphicGetByIdList.h
1 /*
2 * Copyright (C) 2014 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 PolymorphicGetByIdList_h
27 #define PolymorphicGetByIdList_h
28
29 #if ENABLE(JIT)
30
31 #include "CodeOrigin.h"
32 #include "MacroAssembler.h"
33 #include "Opcode.h"
34 #include "Structure.h"
35 #include <wtf/Vector.h>
36
37 namespace JSC {
38
39 class CodeBlock;
40 struct StructureStubInfo;
41
42 class GetByIdAccess {
43 public:
44 enum AccessType {
45 Invalid,
46 SimpleInline, // This is the patched inline access.
47 SimpleStub, // This is a stub.
48 WatchedStub,
49 Getter,
50 CustomGetter,
51 SimpleMiss,
52 };
53
54 GetByIdAccess()
55 : m_type(Invalid)
56 , m_chainCount(0)
57 {
58 }
59
60 GetByIdAccess(
61 VM&, JSCell* owner, AccessType, PassRefPtr<JITStubRoutine>, Structure*,
62 StructureChain* = 0, unsigned chainCount = 0);
63
64 ~GetByIdAccess();
65
66 static GetByIdAccess fromStructureStubInfo(StructureStubInfo&);
67
68 bool isSet() const { return m_type != Invalid; }
69 bool operator!() const { return !isSet(); }
70
71 AccessType type() const { return m_type; }
72
73 Structure* structure() const { return m_structure.get(); }
74
75 StructureChain* chain() const { return m_chain.get(); }
76 unsigned chainCount() const { return m_chainCount; }
77
78 JITStubRoutine* stubRoutine() const
79 {
80 ASSERT(isSet());
81 return m_stubRoutine.get();
82 }
83
84 bool doesCalls() const { return type() == Getter || type() == CustomGetter; }
85 bool isWatched() const { return type() == WatchedStub; }
86 bool isSimple() const { return !doesCalls() && !isWatched(); }
87
88 bool visitWeak(RepatchBuffer&) const;
89
90 private:
91 friend class CodeBlock;
92
93 AccessType m_type;
94 unsigned m_chainCount;
95 WriteBarrier<Structure> m_structure;
96 WriteBarrier<StructureChain> m_chain;
97 RefPtr<JITStubRoutine> m_stubRoutine;
98 };
99
100 class PolymorphicGetByIdList {
101 WTF_MAKE_FAST_ALLOCATED;
102 public:
103 // Either creates a new polymorphic get list, or returns the one that is already in
104 // place.
105 static PolymorphicGetByIdList* from(StructureStubInfo&);
106
107 ~PolymorphicGetByIdList();
108
109 MacroAssemblerCodePtr currentSlowPathTarget(StructureStubInfo& stubInfo) const;
110
111 void addAccess(const GetByIdAccess&);
112
113 bool isEmpty() const { return m_list.isEmpty(); }
114 unsigned size() const { return m_list.size(); }
115 bool isFull() const;
116 bool isAlmostFull() const; // True if adding an element would make isFull() true.
117 const GetByIdAccess& at(unsigned i) const { return m_list[i]; }
118 const GetByIdAccess& operator[](unsigned i) const { return m_list[i]; }
119
120 bool didSelfPatching() const; // Are any of the accesses SimpleInline?
121
122 bool visitWeak(RepatchBuffer&) const;
123
124 private:
125 friend class CodeBlock;
126
127 PolymorphicGetByIdList(StructureStubInfo&);
128
129 Vector<GetByIdAccess, 2> m_list;
130 };
131
132 } // namespace JSC
133
134 #endif // ENABLE(JIT)
135
136 #endif // PolymorphicGetByIdList_h
137