00793cb2a99675d471fe46bbf26e5d4170c12f0c
[WebKit-https.git] / JavaScriptCore / kjs / property_map.h
1 // -*- c-basic-offset: 2 -*-
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         short attributes;
62         short globalGetterSetterFlag;
63         int index;
64     };
65
66 /**
67 * Javascript Property Map.
68 */
69     class PropertyMap {
70     public:
71         PropertyMap();
72         ~PropertyMap();
73
74         void clear();
75         
76         void put(const Identifier &name, JSValue *value, int attributes, bool roCheck = false);
77         void remove(const Identifier &name);
78         JSValue *get(const Identifier &name) const;
79         JSValue *get(const Identifier &name, unsigned &attributes) const;
80         JSValue **getLocation(const Identifier &name);
81
82         void mark() const;
83         void getEnumerablePropertyNames(PropertyNameArray&) const;
84         void getSparseArrayPropertyNames(PropertyNameArray&) const;
85
86         void save(SavedProperties &) const;
87         void restore(const SavedProperties &p);
88
89         bool hasGetterSetterProperties() const { return !!_singleEntry.globalGetterSetterFlag; }
90         void setHasGetterSetterProperties(bool f) { _singleEntry.globalGetterSetterFlag = f; }
91
92         bool containsGettersOrSetters() const;
93     private:
94         static bool keysMatch(const UString::Rep *, const UString::Rep *);
95         void expand();
96         void rehash();
97         void rehash(int newTableSize);
98         
99         void insert(UString::Rep *, JSValue *value, int attributes, int index);
100         
101         void checkConsistency();
102         
103         typedef PropertyMapHashTableEntry Entry;
104         typedef PropertyMapHashTable Table;
105
106         Table *_table;
107         
108         Entry _singleEntry;
109     };
110
111 inline PropertyMap::PropertyMap() : _table(0)
112 {
113     _singleEntry.globalGetterSetterFlag = 0;
114 }
115
116 } // namespace
117
118 #endif // _KJS_PROPERTY_MAP_H_