Ignore:
Timestamp:
Jan 31, 2011, 12:07:21 PM (14 years ago)
Author:
[email protected]
Message:

2011-01-31 Oliver Hunt <[email protected]>

Convert markstack to a slot visitor API
https://bugs.webkit.org/show_bug.cgi?id=53219

rolling r77098, r77099, r77100, r77109, and
r77111 back in, along with a few more Qt fix attempts.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r77113 r77151  
    7171    };
    7272
    73     typedef EncodedJSValue* PropertyStorage;
    74     typedef const EncodedJSValue* ConstPropertyStorage;
     73    typedef WriteBarrierBase<Unknown>* PropertyStorage;
     74    typedef const WriteBarrierBase<Unknown>* ConstPropertyStorage;
    7575
    7676    class JSObject : public JSCell {
     
    180180        bool hasGetterSetterProperties() { return m_structure->hasGetterSetterProperties(); }
    181181
    182         bool putDirect(const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
    183         void putDirect(const Identifier& propertyName, JSValue value, unsigned attr = 0);
    184         bool putDirect(const Identifier& propertyName, JSValue value, PutPropertySlot&);
    185 
    186         void putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr = 0);
    187         void putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
     182        bool putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&);
     183        void putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr = 0);
     184        bool putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, PutPropertySlot&);
     185
     186        void putDirectFunction(JSGlobalData&, const Identifier& propertyName, JSCell*, unsigned attr = 0);
     187        void putDirectFunction(JSGlobalData&, const Identifier& propertyName, JSCell*, unsigned attr, bool checkReadOnly, PutPropertySlot&);
    188188        void putDirectFunction(ExecState* exec, InternalFunction* function, unsigned attr = 0);
    189189        void putDirectFunction(ExecState* exec, JSFunction* function, unsigned attr = 0);
    190190
    191         void putDirectWithoutTransition(const Identifier& propertyName, JSValue value, unsigned attr = 0);
    192         void putDirectFunctionWithoutTransition(const Identifier& propertyName, JSCell* value, unsigned attr = 0);
     191        void putDirectWithoutTransition(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr = 0);
     192        void putDirectFunctionWithoutTransition(JSGlobalData&, const Identifier& propertyName, JSCell* value, unsigned attr = 0);
    193193        void putDirectFunctionWithoutTransition(ExecState* exec, InternalFunction* function, unsigned attr = 0);
    194194        void putDirectFunctionWithoutTransition(ExecState* exec, JSFunction* function, unsigned attr = 0);
    195195
    196196        // Fast access to known property offsets.
    197         JSValue getDirectOffset(size_t offset) const { return JSValue::decode(propertyStorage()[offset]); }
    198         void putDirectOffset(size_t offset, JSValue value) { propertyStorage()[offset] = JSValue::encode(value); }
     197        JSValue getDirectOffset(size_t offset) const { return propertyStorage()[offset].get(); }
     198        void putDirectOffset(JSGlobalData& globalData, size_t offset, JSValue value) { propertyStorage()[offset].set(globalData, this, value); }
     199        void putUndefinedAtDirectOffset(size_t offset) { propertyStorage()[offset].setUndefined(); }
    199200
    200201        void fillGetterPropertySlot(PropertySlot&, JSValue* location);
     
    226227        }
    227228
    228         void flattenDictionaryObject()
    229         {
    230             m_structure->flattenDictionaryStructure(this);
     229        void flattenDictionaryObject(JSGlobalData& globalData)
     230        {
     231            m_structure->flattenDictionaryStructure(globalData, this);
    231232        }
    232233
     
    268269        }
    269270
    270         bool putDirectInternal(const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot, JSCell*);
    271         bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
     271        bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&, JSCell*);
     272        bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&);
    272273        void putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue value, unsigned attr = 0);
    273274
     
    279280        union {
    280281            PropertyStorage m_externalStorage;
    281             EncodedJSValue m_inlineStorage[inlineStorageCapacity];
     282            WriteBarrierBase<Unknown> m_inlineStorage[inlineStorageCapacity];
    282283        };
    283284
     
    451452}
    452453
    453 inline bool JSObject::putDirectInternal(const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot, JSCell* specificFunction)
     454inline bool JSObject::putDirectInternal(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot, JSCell* specificFunction)
    454455{
    455456    ASSERT(value);
     
    468469                return false;
    469470
    470             putDirectOffset(offset, value);
     471            putDirectOffset(globalData, offset, value);
    471472            // At this point, the objects structure only has a specific value set if previously there
    472473            // had been one set, and if the new value being specified is the same (otherwise we would
     
    486487
    487488        ASSERT(offset < m_structure->propertyStorageCapacity());
    488         putDirectOffset(offset, value);
     489        putDirectOffset(globalData, offset, value);
    489490        // See comment on setNewProperty call below.
    490491        if (!specificFunction)
     
    501502        ASSERT(offset < structure->propertyStorageCapacity());
    502503        setStructure(structure.release());
    503         putDirectOffset(offset, value);
     504        putDirectOffset(globalData, offset, value);
    504505        // This is a new property; transitions with specific values are not currently cachable,
    505506        // so leave the slot in an uncachable state.
     
    528529            // case (1) Do the put, then return leaving the slot uncachable.
    529530            if (specificFunction == currentSpecificFunction) {
    530                 putDirectOffset(offset, value);
     531                putDirectOffset(globalData, offset, value);
    531532                return true;
    532533            }
     
    537538        // case (3) set the slot, do the put, return.
    538539        slot.setExistingProperty(this, offset);
    539         putDirectOffset(offset, value);
     540        putDirectOffset(globalData, offset, value);
    540541        return true;
    541542    }
     
    558559    ASSERT(offset < structure->propertyStorageCapacity());
    559560    setStructure(structure.release());
    560     putDirectOffset(offset, value);
     561    putDirectOffset(globalData, offset, value);
    561562    // This is a new property; transitions with specific values are not currently cachable,
    562563    // so leave the slot in an uncachable state.
     
    571572    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    572573
    573     return putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, getJSFunction(globalData, value));
     574    return putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, getJSFunction(globalData, value));
    574575}
    575576
     
    577578{
    578579    PutPropertySlot slot;
    579     putDirectInternal(propertyName, value, attributes, false, slot, getJSFunction(globalData, value));
    580 }
    581 
    582 inline bool JSObject::putDirect(const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
     580    putDirectInternal(globalData, propertyName, value, attributes, false, slot, getJSFunction(globalData, value));
     581}
     582
     583inline bool JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
    583584{
    584585    ASSERT(value);
    585586    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    586587
    587     return putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, 0);
    588 }
    589 
    590 inline void JSObject::putDirect(const Identifier& propertyName, JSValue value, unsigned attributes)
     588    return putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, 0);
     589}
     590
     591inline void JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes)
    591592{
    592593    PutPropertySlot slot;
    593     putDirectInternal(propertyName, value, attributes, false, slot, 0);
    594 }
    595 
    596 inline bool JSObject::putDirect(const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
    597 {
    598     return putDirectInternal(propertyName, value, 0, false, slot, 0);
    599 }
    600 
    601 inline void JSObject::putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
    602 {
    603     putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, value);
    604 }
    605 
    606 inline void JSObject::putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr)
     594    putDirectInternal(globalData, propertyName, value, attributes, false, slot, 0);
     595}
     596
     597inline bool JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
     598{
     599    return putDirectInternal(globalData, propertyName, value, 0, false, slot, 0);
     600}
     601
     602inline void JSObject::putDirectFunction(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
     603{
     604    putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, value);
     605}
     606
     607inline void JSObject::putDirectFunction(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attr)
    607608{
    608609    PutPropertySlot slot;
    609     putDirectInternal(propertyName, value, attr, false, slot, value);
    610 }
    611 
    612 inline void JSObject::putDirectWithoutTransition(const Identifier& propertyName, JSValue value, unsigned attributes)
     610    putDirectInternal(globalData, propertyName, value, attr, false, slot, value);
     611}
     612
     613inline void JSObject::putDirectWithoutTransition(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes)
    613614{
    614615    size_t currentCapacity = m_structure->propertyStorageCapacity();
     
    616617    if (currentCapacity != m_structure->propertyStorageCapacity())
    617618        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
    618     putDirectOffset(offset, value);
    619 }
    620 
    621 inline void JSObject::putDirectFunctionWithoutTransition(const Identifier& propertyName, JSCell* value, unsigned attributes)
     619    putDirectOffset(globalData, offset, value);
     620}
     621
     622inline void JSObject::putDirectFunctionWithoutTransition(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attributes)
    622623{
    623624    size_t currentCapacity = m_structure->propertyStorageCapacity();
     
    625626    if (currentCapacity != m_structure->propertyStorageCapacity())
    626627        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
    627     putDirectOffset(offset, value);
     628    putDirectOffset(globalData, offset, value);
    628629}
    629630
     
    704705{
    705706    ASSERT(isCell() && isObject());
    706     if (!asObject(asCell())->putDirect(propertyName, value, slot) && slot.isStrictMode())
     707    if (!asObject(asCell())->putDirect(exec->globalData(), propertyName, value, slot) && slot.isStrictMode())
    707708        throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
    708709}
     
    726727
    727728    PropertyStorage oldPropertyStorage = (wasInline ? m_inlineStorage : m_externalStorage);
    728     PropertyStorage newPropertyStorage = new EncodedJSValue[newSize];
     729    PropertyStorage newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
    729730
    730731    for (unsigned i = 0; i < oldSize; ++i)
     
    741742    JSCell::markChildren(markStack);
    742743
    743     markStack.append(prototype());
    744    
     744    markStack.append(m_structure->storedPrototypeSlot());
    745745    PropertyStorage storage = propertyStorage();
    746746    size_t storageSize = m_structure->propertyStorageSize();
    747     markStack.appendValues(reinterpret_cast<JSValue*>(storage), storageSize);
     747    markStack.appendValues(storage, storageSize);
    748748}
    749749
Note: See TracChangeset for help on using the changeset viewer.