Reviewed by Oliver.
[WebKit-https.git] / JavaScriptCore / kjs / property_map.h
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Library General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Library General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Library General Public License
17  *  along with this library; see the file COPYING.LIB.  If not, write to
18  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  *  Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef KJS_PROPERTY_MAP_H_
24 #define KJS_PROPERTY_MAP_H_
25
26 #include "identifier.h"
27 #include <wtf/OwnArrayPtr.h>
28
29 namespace KJS {
30
31     class PropertyNameArray;
32     class JSObject;
33     class JSValue;
34     
35     class SavedProperty;
36     
37     struct PropertyMapHashTable;
38     
39 /**
40 * Saved Properties
41 */
42     class SavedProperties {
43     friend class PropertyMap;
44     public:
45         SavedProperties();
46         ~SavedProperties();
47         
48     private:
49         int _count;
50         OwnArrayPtr<SavedProperty> _properties;
51     };
52     
53 /**
54 * A hashtable entry for the @ref PropertyMap.
55 */
56     struct PropertyMapHashTableEntry
57     {
58         PropertyMapHashTableEntry() : key(0) { }
59         UString::Rep *key;
60         JSValue *value;
61         int attributes;
62         int index;
63     };
64
65 /**
66 * Javascript Property Map.
67 */
68     class PropertyMap {
69     public:
70         PropertyMap();
71         ~PropertyMap();
72
73         void clear();
74         
75         void put(const Identifier &name, JSValue *value, int attributes, bool roCheck = false);
76         void remove(const Identifier &name);
77         JSValue *get(const Identifier &name) const;
78         JSValue *get(const Identifier &name, unsigned &attributes) const;
79         JSValue **getLocation(const Identifier &name);
80
81         void mark() const;
82         void getEnumerablePropertyNames(PropertyNameArray&) const;
83         void getSparseArrayPropertyNames(PropertyNameArray&) const;
84
85         void save(SavedProperties &) const;
86         void restore(const SavedProperties &p);
87
88         bool hasGetterSetterProperties() const { return m_getterSetterFlag; }
89         void setHasGetterSetterProperties(bool f) { m_getterSetterFlag = f; }
90
91         bool containsGettersOrSetters() const;
92     private:
93         static bool keysMatch(const UString::Rep *, const UString::Rep *);
94         void expand();
95         void rehash();
96         void rehash(int newTableSize);
97         
98         void insert(UString::Rep *, JSValue *value, int attributes, int index);
99         
100         void checkConsistency();
101         
102         typedef PropertyMapHashTableEntry Entry;
103         typedef PropertyMapHashTable Table;
104
105         UString::Rep* m_singleEntryKey;
106         union {
107           JSValue* singleEntryValue;
108           Table* table;
109         } m_u;
110
111         short m_singleEntryAttributes;
112         bool m_getterSetterFlag : 1;
113         bool m_usingTable : 1;
114     };
115
116     inline PropertyMap::PropertyMap() 
117         : m_singleEntryKey(0)
118         , m_getterSetterFlag(false)
119         , m_usingTable(false)
120
121     {
122     }
123
124 } // namespace
125
126 #endif // _KJS_PROPERTY_MAP_H_