2 * Copyright (C) 2005, 2007, 2008 Apple Inc. All rights reserved.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 #ifndef PropertySlot_h
22 #define PropertySlot_h
24 #include "Identifier.h"
27 #include <wtf/Assertions.h>
28 #include <wtf/NotFound.h>
35 #define JSC_VALUE_MARKER 0
36 #define INDEX_GETTER_MARKER reinterpret_cast<GetValueFunc>(2)
37 #define GETTER_FUNCTION_MARKER reinterpret_cast<GetValueFunc>(3)
41 enum CachedPropertyType
{
49 : m_cachedPropertyType(Uncacheable
)
56 explicit PropertySlot(const JSValue base
)
58 , m_cachedPropertyType(Uncacheable
)
64 typedef JSValue (*GetValueFunc
)(ExecState
*, JSValue slotBase
, const Identifier
&);
65 typedef JSValue (*GetIndexValueFunc
)(ExecState
*, JSValue slotBase
, unsigned);
67 JSValue
getValue(ExecState
* exec
, const Identifier
& propertyName
) const
69 if (m_getValue
== JSC_VALUE_MARKER
)
71 if (m_getValue
== INDEX_GETTER_MARKER
)
72 return m_getIndexValue(exec
, slotBase(), index());
73 if (m_getValue
== GETTER_FUNCTION_MARKER
)
74 return functionGetter(exec
);
75 return m_getValue(exec
, slotBase(), propertyName
);
78 JSValue
getValue(ExecState
* exec
, unsigned propertyName
) const
80 if (m_getValue
== JSC_VALUE_MARKER
)
82 if (m_getValue
== INDEX_GETTER_MARKER
)
83 return m_getIndexValue(exec
, m_slotBase
, m_data
.index
);
84 if (m_getValue
== GETTER_FUNCTION_MARKER
)
85 return functionGetter(exec
);
86 return m_getValue(exec
, slotBase(), Identifier::from(exec
, propertyName
));
89 CachedPropertyType
cachedPropertyType() const { return m_cachedPropertyType
; }
90 bool isCacheable() const { return m_cachedPropertyType
!= Uncacheable
; }
91 bool isCacheableValue() const { return m_cachedPropertyType
== Value
; }
92 size_t cachedOffset() const
94 ASSERT(isCacheable());
98 void setValue(JSValue slotBase
, JSValue value
)
102 m_getValue
= JSC_VALUE_MARKER
;
103 m_slotBase
= slotBase
;
107 void setValue(JSValue slotBase
, JSValue value
, size_t offset
)
110 m_getValue
= JSC_VALUE_MARKER
;
111 m_slotBase
= slotBase
;
114 m_cachedPropertyType
= Value
;
117 void setValue(JSValue value
)
122 m_getValue
= JSC_VALUE_MARKER
;
126 void setCustom(JSValue slotBase
, GetValueFunc getValue
)
130 m_getValue
= getValue
;
132 m_slotBase
= slotBase
;
135 void setCacheableCustom(JSValue slotBase
, GetValueFunc getValue
)
139 m_getValue
= getValue
;
141 m_slotBase
= slotBase
;
142 m_cachedPropertyType
= Custom
;
145 void setCustomIndex(JSValue slotBase
, unsigned index
, GetIndexValueFunc getIndexValue
)
148 ASSERT(getIndexValue
);
149 m_getValue
= INDEX_GETTER_MARKER
;
150 m_getIndexValue
= getIndexValue
;
151 m_slotBase
= slotBase
;
152 m_data
.index
= index
;
155 void setGetterSlot(JSObject
* getterFunc
)
158 m_thisValue
= m_slotBase
;
159 m_getValue
= GETTER_FUNCTION_MARKER
;
160 m_data
.getterFunc
= getterFunc
;
163 void setCacheableGetterSlot(JSValue slotBase
, JSObject
* getterFunc
, unsigned offset
)
166 m_getValue
= GETTER_FUNCTION_MARKER
;
167 m_thisValue
= m_slotBase
;
168 m_slotBase
= slotBase
;
169 m_data
.getterFunc
= getterFunc
;
171 m_cachedPropertyType
= Getter
;
176 setValue(jsUndefined());
179 JSValue
slotBase() const
184 void setBase(JSValue base
)
194 m_slotBase
= JSValue();
207 // Clear offset even in release builds, in case this PropertySlot has been used before.
208 // (For other data members, we don't need to clear anything because reuse would meaningfully overwrite them.)
210 m_cachedPropertyType
= Uncacheable
;
213 unsigned index() const { return m_data
.index
; }
215 GetValueFunc
customGetter() const
217 ASSERT(m_cachedPropertyType
== Custom
);
221 JS_EXPORT_PRIVATE JSValue
functionGetter(ExecState
*) const;
223 GetValueFunc m_getValue
;
224 GetIndexValueFunc m_getIndexValue
;
228 JSObject
* getterFunc
;
236 CachedPropertyType m_cachedPropertyType
;
241 #endif // PropertySlot_h