4867d43df55342f9b0eb8894e2fe589cc85bb182
[WebKit-https.git] / Source / JavaScriptCore / 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