GetById list caching should use something object-oriented rather than PolymorphicAcce...
[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         Getter,
49     };
50     
51     GetByIdAccess()
52         : m_type(Invalid)
53         , m_chainCount(0)
54     {
55     }
56     
57     GetByIdAccess(
58         VM&, JSCell* owner, AccessType, PassRefPtr<JITStubRoutine>, Structure*,
59         StructureChain* = 0, unsigned chainCount = 0);
60     
61     ~GetByIdAccess();
62     
63     static GetByIdAccess fromStructureStubInfo(StructureStubInfo&);
64     
65     bool isSet() const { return m_type != Invalid; }
66     bool operator!() const { return !isSet(); }
67     
68     AccessType type() const { return m_type; }
69     
70     Structure* structure() const { return m_structure.get(); }
71     
72     StructureChain* chain() const { return m_chain.get(); }
73     unsigned chainCount() const { return m_chainCount; }
74     
75     JITStubRoutine* stubRoutine() const
76     {
77         ASSERT(isSet());
78         return m_stubRoutine.get();
79     }
80     
81     bool doesCalls() const { return type() == Getter; }
82     
83     bool visitWeak() const;
84
85 private:
86     friend class CodeBlock;
87     
88     AccessType m_type;
89     unsigned m_chainCount;
90     WriteBarrier<Structure> m_structure;
91     WriteBarrier<StructureChain> m_chain;
92     RefPtr<JITStubRoutine> m_stubRoutine;
93 };
94
95 class PolymorphicGetByIdList {
96     WTF_MAKE_FAST_ALLOCATED;
97 public:
98     // Either creates a new polymorphic get list, or returns the one that is already in
99     // place.
100     static PolymorphicGetByIdList* from(StructureStubInfo&);
101     
102     ~PolymorphicGetByIdList();
103     
104     MacroAssemblerCodePtr currentSlowPathTarget(StructureStubInfo& stubInfo) const;
105     
106     void addAccess(const GetByIdAccess&);
107     
108     bool isEmpty() const { return m_list.isEmpty(); }
109     unsigned size() const { return m_list.size(); }
110     bool isFull() const;
111     bool isAlmostFull() const; // True if adding an element would make isFull() true.
112     const GetByIdAccess& at(unsigned i) const { return m_list[i]; }
113     const GetByIdAccess& operator[](unsigned i) const { return m_list[i]; }
114     
115     bool didSelfPatching() const; // Are any of the accesses SimpleInline?
116     
117     bool visitWeak() const;
118
119 private:
120     friend class CodeBlock;
121     
122     PolymorphicGetByIdList(StructureStubInfo&);
123     
124     Vector<GetByIdAccess, 2> m_list;
125 };
126
127 } // namespace JSC
128
129 #endif // ENABLE(JIT)
130
131 #endif // PolymorphicGetByIdList_h
132