diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSSymbolTableObject.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSSymbolTableObject.h | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h index 2bbe21d06..1913d018b 100644 --- a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h +++ b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h @@ -29,50 +29,49 @@ #ifndef JSSymbolTableObject_h #define JSSymbolTableObject_h -#include "JSObject.h" +#include "JSScope.h" #include "PropertyDescriptor.h" #include "SymbolTable.h" namespace JSC { -class JSSymbolTableObject : public JSNonFinalObject { +class JSSymbolTableObject : public JSScope { public: - typedef JSNonFinalObject Base; + typedef JSScope Base; - SymbolTable& symbolTable() const { return *m_symbolTable; } - - JS_EXPORT_PRIVATE static void destroy(JSCell*); + SharedSymbolTable* symbolTable() const { return m_symbolTable.get(); } static NO_RETURN_DUE_TO_ASSERT void putDirectVirtual(JSObject*, ExecState*, PropertyName, JSValue, unsigned attributes); JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); - bool isDynamicScope(bool& requiresDynamicChecks) const; - protected: - static const unsigned StructureFlags = OverridesGetPropertyNames | JSNonFinalObject::StructureFlags; + static const unsigned StructureFlags = IsEnvironmentRecord | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; - JSSymbolTableObject(JSGlobalData& globalData, Structure* structure, SymbolTable* symbolTable) - : JSNonFinalObject(globalData, structure) - , m_symbolTable(symbolTable) + JSSymbolTableObject(JSGlobalData& globalData, Structure* structure, JSScope* scope) + : Base(globalData, structure, scope) { } - - void finishCreation(JSGlobalData& globalData) + + void finishCreation(JSGlobalData& globalData, SharedSymbolTable* symbolTable = 0) { Base::finishCreation(globalData); - ASSERT(m_symbolTable); + if (!symbolTable) + symbolTable = SharedSymbolTable::create(globalData); + m_symbolTable.set(globalData, this, symbolTable); } - - SymbolTable* m_symbolTable; + + static void visitChildren(JSCell*, SlotVisitor&); + + WriteBarrier<SharedSymbolTable> m_symbolTable; }; template<typename SymbolTableObjectType> inline bool symbolTableGet( SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot) { - SymbolTable& symbolTable = object->symbolTable(); + SymbolTable& symbolTable = *object->symbolTable(); SymbolTable::iterator iter = symbolTable.find(propertyName.publicName()); if (iter == symbolTable.end()) return false; @@ -86,7 +85,7 @@ template<typename SymbolTableObjectType> inline bool symbolTableGet( SymbolTableObjectType* object, PropertyName propertyName, PropertyDescriptor& descriptor) { - SymbolTable& symbolTable = object->symbolTable(); + SymbolTable& symbolTable = *object->symbolTable(); SymbolTable::iterator iter = symbolTable.find(propertyName.publicName()); if (iter == symbolTable.end()) return false; @@ -102,7 +101,7 @@ inline bool symbolTableGet( SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot, bool& slotIsWriteable) { - SymbolTable& symbolTable = object->symbolTable(); + SymbolTable& symbolTable = *object->symbolTable(); SymbolTable::iterator iter = symbolTable.find(propertyName.publicName()); if (iter == symbolTable.end()) return false; @@ -121,7 +120,7 @@ inline bool symbolTablePut( JSGlobalData& globalData = exec->globalData(); ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object)); - SymbolTable& symbolTable = object->symbolTable(); + SymbolTable& symbolTable = *object->symbolTable(); SymbolTable::iterator iter = symbolTable.find(propertyName.publicName()); if (iter == symbolTable.end()) return false; @@ -146,8 +145,8 @@ inline bool symbolTablePutWithAttributes( { ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object)); - SymbolTable::iterator iter = object->symbolTable().find(propertyName.publicName()); - if (iter == object->symbolTable().end()) + SymbolTable::iterator iter = object->symbolTable()->find(propertyName.publicName()); + if (iter == object->symbolTable()->end()) return false; SymbolTableEntry& entry = iter->second; ASSERT(!entry.isNull()); |