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