]>
git.saurik.com Git - apple/javascriptcore.git/blob - bytecode/PolymorphicGetByIdList.h
2 * Copyright (C) 2014 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef PolymorphicGetByIdList_h
27 #define PolymorphicGetByIdList_h
31 #include "CodeOrigin.h"
32 #include "MacroAssembler.h"
34 #include "Structure.h"
35 #include <wtf/Vector.h>
40 struct StructureStubInfo
;
46 SimpleInline
, // This is the patched inline access.
47 SimpleStub
, // This is a stub.
61 VM
&, JSCell
* owner
, AccessType
, PassRefPtr
<JITStubRoutine
>, Structure
*,
62 StructureChain
* = 0, unsigned chainCount
= 0);
66 static GetByIdAccess
fromStructureStubInfo(StructureStubInfo
&);
68 bool isSet() const { return m_type
!= Invalid
; }
69 bool operator!() const { return !isSet(); }
71 AccessType
type() const { return m_type
; }
73 Structure
* structure() const { return m_structure
.get(); }
75 StructureChain
* chain() const { return m_chain
.get(); }
76 unsigned chainCount() const { return m_chainCount
; }
78 JITStubRoutine
* stubRoutine() const
81 return m_stubRoutine
.get();
84 bool doesCalls() const { return type() == Getter
|| type() == CustomGetter
; }
85 bool isWatched() const { return type() == WatchedStub
; }
86 bool isSimple() const { return !doesCalls() && !isWatched(); }
88 bool visitWeak(RepatchBuffer
&) const;
91 friend class CodeBlock
;
94 unsigned m_chainCount
;
95 WriteBarrier
<Structure
> m_structure
;
96 WriteBarrier
<StructureChain
> m_chain
;
97 RefPtr
<JITStubRoutine
> m_stubRoutine
;
100 class PolymorphicGetByIdList
{
101 WTF_MAKE_FAST_ALLOCATED
;
103 // Either creates a new polymorphic get list, or returns the one that is already in
105 static PolymorphicGetByIdList
* from(StructureStubInfo
&);
107 ~PolymorphicGetByIdList();
109 MacroAssemblerCodePtr
currentSlowPathTarget(StructureStubInfo
& stubInfo
) const;
111 void addAccess(const GetByIdAccess
&);
113 bool isEmpty() const { return m_list
.isEmpty(); }
114 unsigned size() const { return m_list
.size(); }
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
]; }
120 bool didSelfPatching() const; // Are any of the accesses SimpleInline?
122 bool visitWeak(RepatchBuffer
&) const;
125 friend class CodeBlock
;
127 PolymorphicGetByIdList(StructureStubInfo
&);
129 Vector
<GetByIdAccess
, 2> m_list
;
134 #endif // ENABLE(JIT)
136 #endif // PolymorphicGetByIdList_h