X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/14957cd040308e3eeec43d26bae5d76da13fcd85..refs/heads/master:/runtime/PropertyNameArray.h diff --git a/runtime/PropertyNameArray.h b/runtime/PropertyNameArray.h index 0da930f..c2f13d8 100644 --- a/runtime/PropertyNameArray.h +++ b/runtime/PropertyNameArray.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2006, 2008, 2012 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,75 +24,103 @@ #include "CallFrame.h" #include "Identifier.h" #include -#include #include namespace JSC { - - class Structure; - class StructureChain; - // FIXME: Rename to PropertyNameArray. - class PropertyNameArrayData : public RefCounted { - public: - typedef Vector PropertyNameVector; - - static PassRefPtr create() { return adoptRef(new PropertyNameArrayData); } - - PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } - - private: - PropertyNameArrayData() - { - } - - PropertyNameVector m_propertyNameVector; - }; - - // FIXME: Rename to PropertyNameArrayBuilder. - class PropertyNameArray { - public: - PropertyNameArray(JSGlobalData* globalData) - : m_data(PropertyNameArrayData::create()) - , m_globalData(globalData) - , m_shouldCache(true) - { - } - - PropertyNameArray(ExecState* exec) - : m_data(PropertyNameArrayData::create()) - , m_globalData(&exec->globalData()) - , m_shouldCache(true) - { +// FIXME: Rename to PropertyNameArray. +class PropertyNameArrayData : public RefCounted { +public: + typedef Vector PropertyNameVector; + + static Ref create() { return adoptRef(*new PropertyNameArrayData); } + + PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } + +private: + PropertyNameArrayData() + { + } + + PropertyNameVector m_propertyNameVector; +}; + +// FIXME: Rename to PropertyNameArrayBuilder. +class PropertyNameArray { +public: + PropertyNameArray(VM* vm) + : m_data(PropertyNameArrayData::create()) + , m_vm(vm) + { + } + + PropertyNameArray(ExecState* exec) + : m_data(PropertyNameArrayData::create()) + , m_vm(&exec->vm()) + { + } + + VM* vm() { return m_vm; } + + void add(uint32_t index) + { + add(Identifier::from(m_vm, index)); + } + + void add(const Identifier&); + void add(UniquedStringImpl*); + void addKnownUnique(UniquedStringImpl*); + + Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } + const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } + + void setData(PassRefPtr data) { m_data = data; } + PropertyNameArrayData* data() { return m_data.get(); } + PassRefPtr releaseData() { return m_data.release(); } + + // FIXME: Remove these functions. + bool canAddKnownUniqueForStructure() const { return m_data->propertyNameVector().isEmpty(); } + typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator; + size_t size() const { return m_data->propertyNameVector().size(); } + const_iterator begin() const { return m_data->propertyNameVector().begin(); } + const_iterator end() const { return m_data->propertyNameVector().end(); } + +private: + RefPtr m_data; + HashSet m_set; + VM* m_vm; +}; + +ALWAYS_INLINE void PropertyNameArray::add(const Identifier& identifier) +{ + add(identifier.impl()); +} + +ALWAYS_INLINE void PropertyNameArray::addKnownUnique(UniquedStringImpl* identifier) +{ + m_data->propertyNameVector().append(Identifier::fromUid(m_vm, identifier)); +} + +ALWAYS_INLINE void PropertyNameArray::add(UniquedStringImpl* identifier) +{ + static const unsigned setThreshold = 20; + + ASSERT(identifier); + + if (size() < setThreshold) { + if (m_data->propertyNameVector().contains(identifier)) + return; + } else { + if (m_set.isEmpty()) { + for (Identifier& name : m_data->propertyNameVector()) + m_set.add(name.impl()); } + if (!m_set.add(identifier).isNewEntry) + return; + } - JSGlobalData* globalData() { return m_globalData; } - - void add(const Identifier& identifier) { add(identifier.impl()); } - void add(StringImpl*); - void addKnownUnique(StringImpl* identifier) { m_data->propertyNameVector().append(Identifier(m_globalData, identifier)); } - - Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } - const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } - - void setData(PassRefPtr data) { m_data = data; } - PropertyNameArrayData* data() { return m_data.get(); } - PassRefPtr releaseData() { return m_data.release(); } - - // FIXME: Remove these functions. - typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator; - size_t size() const { return m_data->propertyNameVector().size(); } - const_iterator begin() const { return m_data->propertyNameVector().begin(); } - const_iterator end() const { return m_data->propertyNameVector().end(); } - - private: - typedef HashSet > IdentifierSet; - - RefPtr m_data; - IdentifierSet m_set; - JSGlobalData* m_globalData; - bool m_shouldCache; - }; + addKnownUnique(identifier); +} } // namespace JSC