Foo::s_info should be Foo::info(), so that you can change how the s_info is actually...
[WebKit-https.git] / Source / JavaScriptCore / runtime / SparseArrayValueMap.h
1 /*
2  * Copyright (C) 2011, 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  * 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.
12  *
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. 
24  */
25
26 #ifndef SparseArrayValueMap_h
27 #define SparseArrayValueMap_h
28
29 #include "JSCell.h"
30 #include "JSTypeInfo.h"
31 #include "PropertyDescriptor.h"
32 #include "PutDirectIndexMode.h"
33 #include "WriteBarrier.h"
34 #include <wtf/HashMap.h>
35 #include <wtf/Platform.h>
36
37 namespace JSC {
38
39 class SparseArrayValueMap;
40
41 struct SparseArrayEntry : public WriteBarrier<Unknown> {
42     typedef WriteBarrier<Unknown> Base;
43
44     SparseArrayEntry() : attributes(0) { }
45
46     JSValue get(ExecState*, JSObject*) const;
47     void get(JSObject*, PropertySlot&) const;
48     void get(PropertyDescriptor&) const;
49     void put(ExecState*, JSValue thisValue, SparseArrayValueMap*, JSValue, bool shouldThrow);
50     JSValue getNonSparseMode() const;
51
52     unsigned attributes;
53 };
54
55 class SparseArrayValueMap : public JSCell {
56 public:
57     typedef JSCell Base;
58     
59 private:
60     typedef HashMap<uint64_t, SparseArrayEntry, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t> > Map;
61
62     enum Flags {
63         Normal = 0,
64         SparseMode = 1,
65         LengthIsReadOnly = 2,
66     };
67
68     SparseArrayValueMap(VM&);
69     ~SparseArrayValueMap();
70     
71     void finishCreation(VM&);
72
73     static const unsigned StructureFlags = OverridesVisitChildren | JSCell::StructureFlags;
74
75 public:
76     DECLARE_EXPORT_INFO;
77     
78     typedef Map::iterator iterator;
79     typedef Map::const_iterator const_iterator;
80     typedef Map::AddResult AddResult;
81
82     static SparseArrayValueMap* create(VM&);
83     
84     static const bool needsDestruction = true;
85     static const bool hasImmortalStructure = true;
86     static void destroy(JSCell*);
87     
88     static Structure* createStructure(VM&, JSGlobalObject*, JSValue prototype);
89
90     static void visitChildren(JSCell*, SlotVisitor&);
91
92     bool sparseMode()
93     {
94         return m_flags & SparseMode;
95     }
96
97     void setSparseMode()
98     {
99         m_flags = static_cast<Flags>(m_flags | SparseMode);
100     }
101
102     bool lengthIsReadOnly()
103     {
104         return m_flags & LengthIsReadOnly;
105     }
106
107     void setLengthIsReadOnly()
108     {
109         m_flags = static_cast<Flags>(m_flags | LengthIsReadOnly);
110     }
111
112     // These methods may mutate the contents of the map
113     void putEntry(ExecState*, JSObject*, unsigned, JSValue, bool shouldThrow);
114     bool putDirect(ExecState*, JSObject*, unsigned, JSValue, unsigned attributes, PutDirectIndexMode);
115     AddResult add(JSObject*, unsigned);
116     iterator find(unsigned i) { return m_map.find(i); }
117     // This should ASSERT the remove is valid (check the result of the find).
118     void remove(iterator it) { m_map.remove(it); }
119     void remove(unsigned i) { m_map.remove(i); }
120
121     // These methods do not mutate the contents of the map.
122     iterator notFound() { return m_map.end(); }
123     bool isEmpty() const { return m_map.isEmpty(); }
124     bool contains(unsigned i) const { return m_map.contains(i); }
125     size_t size() const { return m_map.size(); }
126     // Only allow const begin/end iteration.
127     const_iterator begin() const { return m_map.begin(); }
128     const_iterator end() const { return m_map.end(); }
129
130 private:
131     Map m_map;
132     Flags m_flags;
133     size_t m_reportedCapacity;
134 };
135
136 } // namespace JSC
137
138 #endif // SparseArrayValueMap_h
139