1 /* 2 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 3 * 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. 8 * 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. 13 * 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. 18 * 19 */ 20 21 #ifndef PropertyNameArray_h 22 #define PropertyNameArray_h 23 24 #include "CallFrame.h" 25 #include "Identifier.h" 26 #include "Structure.h" 27 #include <wtf/HashSet.h> 28 #include <wtf/Vector.h> 29 30 namespace JSC { 31 32 class PropertyNameArrayData : public RefCounted<PropertyNameArrayData> { 33 public: 34 typedef Vector<Identifier, 20> PropertyNameVector; 35 typedef PropertyNameVector::const_iterator const_iterator; 36 create()37 static PassRefPtr<PropertyNameArrayData> create() { return adoptRef(new PropertyNameArrayData); } 38 begin()39 const_iterator begin() const { return m_propertyNameVector.begin(); } end()40 const_iterator end() const { return m_propertyNameVector.end(); } 41 propertyNameVector()42 PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } 43 setCachedStructure(Structure * structure)44 void setCachedStructure(Structure* structure) { m_cachedStructure = structure; } cachedStructure()45 Structure* cachedStructure() const { return m_cachedStructure; } 46 setCachedPrototypeChain(PassRefPtr<StructureChain> cachedPrototypeChain)47 void setCachedPrototypeChain(PassRefPtr<StructureChain> cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; } cachedPrototypeChain()48 StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); } 49 50 private: PropertyNameArrayData()51 PropertyNameArrayData() 52 : m_cachedStructure(0) 53 { 54 } 55 56 PropertyNameVector m_propertyNameVector; 57 Structure* m_cachedStructure; 58 RefPtr<StructureChain> m_cachedPrototypeChain; 59 }; 60 61 class PropertyNameArray { 62 public: 63 typedef PropertyNameArrayData::const_iterator const_iterator; 64 PropertyNameArray(JSGlobalData * globalData)65 PropertyNameArray(JSGlobalData* globalData) 66 : m_data(PropertyNameArrayData::create()) 67 , m_globalData(globalData) 68 , m_shouldCache(true) 69 { 70 } 71 PropertyNameArray(ExecState * exec)72 PropertyNameArray(ExecState* exec) 73 : m_data(PropertyNameArrayData::create()) 74 , m_globalData(&exec->globalData()) 75 , m_shouldCache(true) 76 { 77 } 78 globalData()79 JSGlobalData* globalData() { return m_globalData; } 80 add(const Identifier & identifier)81 void add(const Identifier& identifier) { add(identifier.ustring().rep()); } 82 void add(UString::Rep*); addKnownUnique(UString::Rep * identifier)83 void addKnownUnique(UString::Rep* identifier) { m_data->propertyNameVector().append(Identifier(m_globalData, identifier)); } 84 size()85 size_t size() const { return m_data->propertyNameVector().size(); } 86 87 Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } 88 const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } 89 begin()90 const_iterator begin() const { return m_data->begin(); } end()91 const_iterator end() const { return m_data->end(); } 92 setData(PassRefPtr<PropertyNameArrayData> data)93 void setData(PassRefPtr<PropertyNameArrayData> data) { m_data = data; } data()94 PropertyNameArrayData* data() { return m_data.get(); } 95 releaseData()96 PassRefPtr<PropertyNameArrayData> releaseData() { return m_data.release(); } 97 setShouldCache(bool shouldCache)98 void setShouldCache(bool shouldCache) { m_shouldCache = shouldCache; } shouldCache()99 bool shouldCache() const { return m_shouldCache; } 100 101 private: 102 typedef HashSet<UString::Rep*, PtrHash<UString::Rep*> > IdentifierSet; 103 104 RefPtr<PropertyNameArrayData> m_data; 105 IdentifierSet m_set; 106 JSGlobalData* m_globalData; 107 bool m_shouldCache; 108 }; 109 110 } // namespace JSC 111 112 #endif // PropertyNameArray_h 113