]>
Commit | Line | Data |
---|---|---|
81345200 A |
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, | |
ed1e77d3 A |
50 | CustomGetter, |
51 | SimpleMiss, | |
81345200 A |
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 |