X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..40a37d088818fc2fbeba2ef850dbcaaf294befbf:/runtime/PropertyNameArray.h diff --git a/runtime/PropertyNameArray.h b/runtime/PropertyNameArray.h index b4382f4..bfbddaa 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 @@ -23,88 +23,91 @@ #include "CallFrame.h" #include "Identifier.h" -#include "Structure.h" #include #include namespace JSC { + + class Structure; + class StructureChain; + // FIXME: Rename to PropertyNameArray. class PropertyNameArrayData : public RefCounted { public: typedef Vector PropertyNameVector; - typedef PropertyNameVector::const_iterator const_iterator; static PassRefPtr create() { return adoptRef(new PropertyNameArrayData); } - const_iterator begin() const { return m_propertyNameVector.begin(); } - const_iterator end() const { return m_propertyNameVector.end(); } - PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } - void setCachedStructure(Structure* structure) { m_cachedStructure = structure; } - Structure* cachedStructure() const { return m_cachedStructure; } - - void setCachedPrototypeChain(PassRefPtr cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; } - StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); } - private: PropertyNameArrayData() - : m_cachedStructure(0) { } PropertyNameVector m_propertyNameVector; - Structure* m_cachedStructure; - RefPtr m_cachedPrototypeChain; }; + // FIXME: Rename to PropertyNameArrayBuilder. class PropertyNameArray { public: - typedef PropertyNameArrayData::const_iterator const_iterator; - - PropertyNameArray(JSGlobalData* globalData) + PropertyNameArray(VM* vm) : m_data(PropertyNameArrayData::create()) - , m_globalData(globalData) - , m_shouldCache(true) + , m_vm(vm) + , m_numCacheableSlots(0) + , m_baseObject(0) { } PropertyNameArray(ExecState* exec) : m_data(PropertyNameArrayData::create()) - , m_globalData(&exec->globalData()) - , m_shouldCache(true) + , m_vm(&exec->vm()) + , m_numCacheableSlots(0) + , m_baseObject(0) { } - JSGlobalData* globalData() { return m_globalData; } + VM* vm() { return m_vm; } - void add(const Identifier& identifier) { add(identifier.ustring().rep()); } - void add(UString::Rep*); - void addKnownUnique(UString::Rep* identifier) { m_data->propertyNameVector().append(Identifier(m_globalData, identifier)); } - - size_t size() const { return m_data->propertyNameVector().size(); } + void add(const Identifier& identifier) { add(identifier.impl()); } + JS_EXPORT_PRIVATE void add(StringImpl*); + void addKnownUnique(StringImpl* identifier) { m_data->propertyNameVector().append(Identifier(m_vm, identifier)); } Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } - const_iterator begin() const { return m_data->begin(); } - const_iterator end() const { return m_data->end(); } - void setData(PassRefPtr data) { m_data = data; } PropertyNameArrayData* data() { return m_data.get(); } - PassRefPtr releaseData() { return m_data.release(); } - void setShouldCache(bool shouldCache) { m_shouldCache = shouldCache; } - bool shouldCache() const { return m_shouldCache; } + // 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(); } + + size_t numCacheableSlots() const { return m_numCacheableSlots; } + void setNumCacheableSlotsForObject(JSObject* object, size_t numCacheableSlots) + { + if (object != m_baseObject) + return; + m_numCacheableSlots = numCacheableSlots; + } + void setBaseObject(JSObject* object) + { + if (m_baseObject) + return; + m_baseObject = object; + } private: - typedef HashSet > IdentifierSet; + typedef HashSet> IdentifierSet; RefPtr m_data; IdentifierSet m_set; - JSGlobalData* m_globalData; - bool m_shouldCache; + VM* m_vm; + size_t m_numCacheableSlots; + JSObject* m_baseObject; }; } // namespace JSC