18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef Structure_h 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define Structure_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Identifier.h" 302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "JSCell.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSType.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSValue.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PropertyMapHashTable.h" 34cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "PropertyNameArray.h" 35cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "Protect.h" 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "StructureTransitionTable.h" 37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSTypeInfo.h" 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "UString.h" 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "Weak.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/PassRefPtr.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCounted.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class MarkStack; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class PropertyNameArray; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class PropertyNameArrayData; 492bde8e466a4451c7319e3a072d118917957d6554Steve Block class StructureChain; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch struct ClassInfo; 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 53d0825bca7fe65beaee391d30da42e937db621564Steve Block enum EnumerationMode { 54d0825bca7fe65beaee391d30da42e937db621564Steve Block ExcludeDontEnumProperties, 55d0825bca7fe65beaee391d30da42e937db621564Steve Block IncludeDontEnumProperties 56d0825bca7fe65beaee391d30da42e937db621564Steve Block }; 57d0825bca7fe65beaee391d30da42e937db621564Steve Block 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch class Structure : public JSCell { 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block friend class StructureTransitionTable; 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* create(JSGlobalData& globalData, JSValue prototype, const TypeInfo& typeInfo, unsigned anonymousSlotCount, const ClassInfo* classInfo) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(globalData.structureStructure); 642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return new (&globalData) Structure(globalData, prototype, typeInfo, anonymousSlotCount, classInfo); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void dumpStatistics(); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* addPropertyTransition(JSGlobalData&, Structure*, const Identifier& propertyName, unsigned attributes, JSCell* specificValue, size_t& offset); 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* addPropertyTransitionToExistingStructure(Structure*, const Identifier& propertyName, unsigned attributes, JSCell* specificValue, size_t& offset); 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* removePropertyTransition(JSGlobalData&, Structure*, const Identifier& propertyName, size_t& offset); 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* changePrototypeTransition(JSGlobalData&, Structure*, JSValue prototype); 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* despecifyFunctionTransition(JSGlobalData&, Structure*, const Identifier&); 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* getterSetterTransition(JSGlobalData&, Structure*); 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* toCacheableDictionaryTransition(JSGlobalData&, Structure*); 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* toUncacheableDictionaryTransition(JSGlobalData&, Structure*); 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* sealTransition(JSGlobalData&, Structure*); 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* freezeTransition(JSGlobalData&, Structure*); 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* preventExtensionsTransition(JSGlobalData&, Structure*); 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isSealed(JSGlobalData&); 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isFrozen(JSGlobalData&); 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool isExtensible() const { return !m_preventExtensions; } 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Structure* flattenDictionaryStructure(JSGlobalData&, JSObject*); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ~Structure(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These should be used with caution. 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t addPropertyWithoutTransition(JSGlobalData&, const Identifier& propertyName, unsigned attributes, JSCell* specificValue); 912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t removePropertyWithoutTransition(JSGlobalData&, const Identifier& propertyName); 922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setPrototypeWithoutTransition(JSGlobalData& globalData, JSValue prototype) { m_prototype.set(globalData, this, prototype); } 93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool isDictionary() const { return m_dictionaryKind != NoneDictionaryKind; } 95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool isUncacheableDictionary() const { return m_dictionaryKind == UncachedDictionaryKind; } 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const TypeInfo& typeInfo() const { return m_typeInfo; } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block JSValue storedPrototype() const { return m_prototype.get(); } 1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue prototypeForLookup(ExecState*) const; 1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian StructureChain* prototypeChain(ExecState*) const; 1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void markChildren(MarkStack&); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Structure* previousID() const { return m_previous.get(); } 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void growPropertyStorageCapacity(); 107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block unsigned propertyStorageCapacity() const { return m_propertyStorageCapacity; } 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned propertyStorageSize() const { return m_anonymousSlotCount + (m_propertyTable ? m_propertyTable->propertyStorageSize() : static_cast<unsigned>(m_offset + 1)); } 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool isUsingInlineStorage() const; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t get(JSGlobalData&, const Identifier& propertyName); 1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t get(JSGlobalData&, StringImpl* propertyName, unsigned& attributes, JSCell*& specificValue); 1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t get(JSGlobalData& globalData, const Identifier& propertyName, unsigned& attributes, JSCell*& specificValue) 1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(!propertyName.isNull()); 1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return get(globalData, propertyName.impl(), attributes, specificValue); 117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; } 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setHasGetterSetterProperties(bool hasGetterSetterProperties) { m_hasGetterSetterProperties = hasGetterSetterProperties; } 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 122cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block bool hasNonEnumerableProperties() const { return m_hasNonEnumerableProperties; } 123cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block bool hasAnonymousSlots() const { return !!m_anonymousSlotCount; } 1255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block unsigned anonymousSlotCount() const { return m_anonymousSlotCount; } 126cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool isEmpty() const { return m_propertyTable ? m_propertyTable->isEmpty() : m_offset == noOffset; } 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void despecifyDictionaryFunction(JSGlobalData&, const Identifier& propertyName); 130d0825bca7fe65beaee391d30da42e937db621564Steve Block void disableSpecificFunctionTracking() { m_specificFunctionThrashCount = maxSpecificFunctionThrashCount; } 1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 13281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void setEnumerationCache(JSGlobalData&, JSPropertyNameIterator* enumerationCache); // Defined in JSPropertyNameIterator.h. 1338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block JSPropertyNameIterator* enumerationCache(); // Defined in JSPropertyNameIterator.h. 1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void getPropertyNames(JSGlobalData&, PropertyNameArray&, EnumerationMode mode); 13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const ClassInfo* classInfo() const { return m_classInfo; } 13781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1382bde8e466a4451c7319e3a072d118917957d6554Steve Block static ptrdiff_t prototypeOffset() 1392bde8e466a4451c7319e3a072d118917957d6554Steve Block { 1402bde8e466a4451c7319e3a072d118917957d6554Steve Block return OBJECT_OFFSETOF(Structure, m_prototype); 1412bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1422bde8e466a4451c7319e3a072d118917957d6554Steve Block 1432bde8e466a4451c7319e3a072d118917957d6554Steve Block static ptrdiff_t typeInfoFlagsOffset() 1442bde8e466a4451c7319e3a072d118917957d6554Steve Block { 1452bde8e466a4451c7319e3a072d118917957d6554Steve Block return OBJECT_OFFSETOF(Structure, m_typeInfo) + TypeInfo::flagsOffset(); 1462bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1472bde8e466a4451c7319e3a072d118917957d6554Steve Block 1482bde8e466a4451c7319e3a072d118917957d6554Steve Block static ptrdiff_t typeInfoTypeOffset() 1492bde8e466a4451c7319e3a072d118917957d6554Steve Block { 1502bde8e466a4451c7319e3a072d118917957d6554Steve Block return OBJECT_OFFSETOF(Structure, m_typeInfo) + TypeInfo::typeOffset(); 1512bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1522bde8e466a4451c7319e3a072d118917957d6554Steve Block 1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData) 1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!globalData.structureStructure); 1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return new (&globalData) Structure(globalData); 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Structure(JSGlobalData&, JSValue prototype, const TypeInfo&, unsigned anonymousSlotCount, const ClassInfo*); 1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Structure(JSGlobalData&); 1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Structure(JSGlobalData&, const Structure*); 163d0825bca7fe65beaee391d30da42e937db621564Steve Block 1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* create(JSGlobalData& globalData, const Structure* structure) 16581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(globalData.structureStructure); 1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return new (&globalData) Structure(globalData, structure); 16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static const ClassInfo s_info; 1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block typedef enum { 173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NoneDictionaryKind = 0, 174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block CachedDictionaryKind = 1, 175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block UncachedDictionaryKind = 2 176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } DictionaryKind; 1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* toDictionaryTransition(JSGlobalData&, Structure*, DictionaryKind); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t putSpecificValue(JSGlobalData&, const Identifier& propertyName, unsigned attributes, JSCell* specificValue); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t remove(const Identifier& propertyName); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void createPropertyMap(unsigned keyCount = 0); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void checkConsistency(); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool despecifyFunction(JSGlobalData&, const Identifier&); 1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void despecifyAllFunctions(JSGlobalData&); 1875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch PropertyTable* copyPropertyTable(JSGlobalData&, Structure* owner); 1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void materializePropertyMap(JSGlobalData&); 1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void materializePropertyMapIfNecessary(JSGlobalData& globalData) 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_propertyTable && m_previous) 1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch materializePropertyMap(globalData); 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project signed char transitionCount() const 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Since the number of transitions is always the same as m_offset, we keep the size of Structure down by not storing both. 199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_offset == noOffset ? 0 : m_offset + 1; 200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 201692e5dbf12901edacf14812a6fae25462920af42Steve Block 2025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool isValid(ExecState*, StructureChain* cachedPrototypeChain) const; 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const signed char s_maxTransitionLength = 64; 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const signed char noOffset = -1; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 208d0825bca7fe65beaee391d30da42e937db621564Steve Block static const unsigned maxSpecificFunctionThrashCount = 3; 209d0825bca7fe65beaee391d30da42e937db621564Steve Block 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeInfo m_typeInfo; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WriteBarrier<Unknown> m_prototype; 2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch mutable WriteBarrier<StructureChain> m_cachedPrototypeChain; 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WriteBarrier<Structure> m_previous; 216f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick RefPtr<StringImpl> m_nameInPrevious; 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WriteBarrier<JSCell> m_specificValueInPrevious; 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const ClassInfo* m_classInfo; 22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 22181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch StructureTransitionTable m_transitionTable; 222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WriteBarrier<JSPropertyNameIterator> m_enumerationCache; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnPtr<PropertyTable> m_propertyTable; 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 227cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block uint32_t m_propertyStorageCapacity; 2285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // m_offset does not account for anonymous slots 230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project signed char m_offset; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned m_dictionaryKind : 2; 233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_isPinnedPropertyTable : 1; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_hasGetterSetterProperties : 1; 235cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block bool m_hasNonEnumerableProperties : 1; 236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if COMPILER(WINSCW) 237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Workaround for Symbian WINSCW compiler that cannot resolve unsigned type of the declared 238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // bitfield, when used as argument in make_pair() function calls in structure.ccp. 239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // This bitfield optimization is insignificant for the Symbian emulator target. 240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned m_attributesInPrevious; 241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 2425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned m_attributesInPrevious : 7; 243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 244d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned m_specificFunctionThrashCount : 2; 2455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block unsigned m_anonymousSlotCount : 5; 24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch unsigned m_preventExtensions : 1; 247692e5dbf12901edacf14812a6fae25462920af42Steve Block // 4 free bits 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline size_t Structure::get(JSGlobalData& globalData, const Identifier& propertyName) 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch materializePropertyMapIfNecessary(globalData); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_propertyTable) 25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return notFound; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch PropertyMapEntry* entry = m_propertyTable->find(propertyName.impl()).first; 25781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(!entry || entry->offset >= m_anonymousSlotCount); 25881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return entry ? entry->offset : notFound; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSCell::isObject() const 2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return m_structure->typeInfo().type() == ObjectType; 2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSCell::isString() const 2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return m_structure->typeInfo().type() == StringType; 2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline const ClassInfo* JSCell::classInfo() const 2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return m_structure->classInfo(); 2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline Structure* JSCell::createDummyStructure(JSGlobalData& globalData) 2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return Structure::create(globalData, jsNull(), TypeInfo(UnspecifiedType), AnonymousSlotCount, 0); 2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline bool JSValue::needsThisConversion() const 2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (UNLIKELY(!isCell())) 2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return asCell()->structure()->typeInfo().needsThisConversion(); 2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ALWAYS_INLINE void MarkStack::internalAppend(JSCell* cell) 2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!m_isCheckingForDefaultMarkViolation); 2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(cell); 2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (Heap::testAndSetMarked(cell)) 2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (cell->structure()->typeInfo().type() >= CompoundType) 2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_values.append(cell); 2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline StructureTransitionTable::Hash::Key StructureTransitionTable::keyForWeakGCMapFinalizer(void*, Structure* structure) 2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return Hash::Key(structure->m_nameInPrevious.get(), structure->m_attributesInPrevious); 3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // Structure_h 306