a93317781e21ea5b1df7653c1b60e80950f3b9d5
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSSymbolTableObject.h
1 /*
2  * Copyright (C) 2012 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef JSSymbolTableObject_h
30 #define JSSymbolTableObject_h
31
32 #include "JSObject.h"
33 #include "PropertyDescriptor.h"
34 #include "SymbolTable.h"
35
36 namespace JSC {
37
38 class JSSymbolTableObject : public JSNonFinalObject {
39 public:
40     typedef JSNonFinalObject Base;
41     
42     SymbolTable& symbolTable() const { return *m_symbolTable; }
43     
44     JS_EXPORT_PRIVATE static void destroy(JSCell*);
45     
46     static NO_RETURN_DUE_TO_ASSERT void putDirectVirtual(JSObject*, ExecState*, PropertyName, JSValue, unsigned attributes);
47     
48     JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName);
49     JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
50     
51     bool isDynamicScope(bool& requiresDynamicChecks) const;
52     
53 protected:
54     static const unsigned StructureFlags = OverridesGetPropertyNames | JSNonFinalObject::StructureFlags;
55     
56     JSSymbolTableObject(JSGlobalData& globalData, Structure* structure, SymbolTable* symbolTable)
57         : JSNonFinalObject(globalData, structure)
58         , m_symbolTable(symbolTable)
59     {
60     }
61     
62     void finishCreation(JSGlobalData& globalData)
63     {
64         Base::finishCreation(globalData);
65         ASSERT(m_symbolTable);
66     }
67     
68     SymbolTable* m_symbolTable;
69 };
70
71 template<typename SymbolTableObjectType>
72 inline bool symbolTableGet(
73     SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot)
74 {
75     SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
76     if (entry.isNull())
77         return false;
78     slot.setValue(object->registerAt(entry.getIndex()).get());
79     return true;
80 }
81
82 template<typename SymbolTableObjectType>
83 inline bool symbolTableGet(
84     SymbolTableObjectType* object, PropertyName propertyName, PropertyDescriptor& descriptor)
85 {
86     SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
87     if (entry.isNull())
88         return false;
89     descriptor.setDescriptor(
90         object->registerAt(entry.getIndex()).get(), entry.getAttributes() | DontDelete);
91     return true;
92 }
93
94 template<typename SymbolTableObjectType>
95 inline bool symbolTableGet(
96     SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot,
97     bool& slotIsWriteable)
98 {
99     SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
100     if (entry.isNull())
101         return false;
102     slot.setValue(object->registerAt(entry.getIndex()).get());
103     slotIsWriteable = !entry.isReadOnly();
104     return true;
105 }
106
107 template<typename SymbolTableObjectType>
108 inline bool symbolTablePut(
109     SymbolTableObjectType* object, ExecState* exec, PropertyName propertyName, JSValue value,
110     bool shouldThrow)
111 {
112     JSGlobalData& globalData = exec->globalData();
113     ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object));
114     
115     SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
116     if (entry.isNull())
117         return false;
118     if (entry.isReadOnly()) {
119         if (shouldThrow)
120             throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
121         return true;
122     }
123     object->registerAt(entry.getIndex()).set(globalData, object, value);
124     return true;
125 }
126
127 template<typename SymbolTableObjectType>
128 inline bool symbolTablePutWithAttributes(
129     SymbolTableObjectType* object, JSGlobalData& globalData, PropertyName propertyName,
130     JSValue value, unsigned attributes)
131 {
132     ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object));
133     
134     SymbolTable::iterator iter = object->symbolTable().find(propertyName.publicName());
135     if (iter == object->symbolTable().end())
136         return false;
137     SymbolTableEntry& entry = iter->second;
138     ASSERT(!entry.isNull());
139     entry.setAttributes(attributes);
140     object->registerAt(entry.getIndex()).set(globalData, object, value);
141     return true;
142 }
143
144 } // namespace JSC
145
146 #endif // JSSymbolTableObject_h
147