]>
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.
60 VM
&, JSCell
* owner
, AccessType
, PassRefPtr
<JITStubRoutine
>, Structure
*,
61 StructureChain
* = 0, unsigned chainCount
= 0);
65 static GetByIdAccess
fromStructureStubInfo(StructureStubInfo
&);
67 bool isSet() const { return m_type
!= Invalid
; }
68 bool operator!() const { return !isSet(); }
70 AccessType
type() const { return m_type
; }
72 Structure
* structure() const { return m_structure
.get(); }
74 StructureChain
* chain() const { return m_chain
.get(); }
75 unsigned chainCount() const { return m_chainCount
; }
77 JITStubRoutine
* stubRoutine() const
80 return m_stubRoutine
.get();
83 bool doesCalls() const { return type() == Getter
|| type() == CustomGetter
; }
84 bool isWatched() const { return type() == WatchedStub
; }
85 bool isSimple() const { return !doesCalls() && !isWatched(); }
87 bool visitWeak(RepatchBuffer
&) const;
90 friend class CodeBlock
;
93 unsigned m_chainCount
;
94 WriteBarrier
<Structure
> m_structure
;
95 WriteBarrier
<StructureChain
> m_chain
;
96 RefPtr
<JITStubRoutine
> m_stubRoutine
;
99 class PolymorphicGetByIdList
{
100 WTF_MAKE_FAST_ALLOCATED
;
102 // Either creates a new polymorphic get list, or returns the one that is already in
104 static PolymorphicGetByIdList
* from(StructureStubInfo
&);
106 ~PolymorphicGetByIdList();
108 MacroAssemblerCodePtr
currentSlowPathTarget(StructureStubInfo
& stubInfo
) const;
110 void addAccess(const GetByIdAccess
&);
112 bool isEmpty() const { return m_list
.isEmpty(); }
113 unsigned size() const { return m_list
.size(); }
115 bool isAlmostFull() const; // True if adding an element would make isFull() true.
116 const GetByIdAccess
& at(unsigned i
) const { return m_list
[i
]; }
117 const GetByIdAccess
& operator[](unsigned i
) const { return m_list
[i
]; }
119 bool didSelfPatching() const; // Are any of the accesses SimpleInline?
121 bool visitWeak(RepatchBuffer
&) const;
124 friend class CodeBlock
;
126 PolymorphicGetByIdList(StructureStubInfo
&);
128 Vector
<GetByIdAccess
, 2> m_list
;
133 #endif // ENABLE(JIT)
135 #endif // PolymorphicGetByIdList_h