diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/Structure.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/Structure.h | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/runtime/Structure.h b/Source/JavaScriptCore/runtime/Structure.h index f67c4e7f7..448a81c27 100644 --- a/Source/JavaScriptCore/runtime/Structure.h +++ b/Source/JavaScriptCore/runtime/Structure.h @@ -37,6 +37,7 @@ #include "StructureTransitionTable.h" #include "JSTypeInfo.h" #include "UString.h" +#include "Watchpoint.h" #include "Weak.h" #include <wtf/PassOwnPtr.h> #include <wtf/PassRefPtr.h> @@ -127,6 +128,8 @@ namespace JSC { JSValue storedPrototype() const { return m_prototype.get(); } JSValue prototypeForLookup(ExecState*) const; + JSValue prototypeForLookup(JSGlobalObject*) const; + JSValue prototypeForLookup(CodeBlock*) const; StructureChain* prototypeChain(ExecState*) const; static void visitChildren(JSCell*, SlotVisitor&); @@ -208,6 +211,27 @@ namespace JSC { return structure; } + bool transitionWatchpointSetHasBeenInvalidated() const + { + return m_transitionWatchpointSet.hasBeenInvalidated(); + } + + bool transitionWatchpointSetIsStillValid() const + { + return m_transitionWatchpointSet.isStillValid(); + } + + void addTransitionWatchpoint(Watchpoint* watchpoint) const + { + ASSERT(transitionWatchpointSetIsStillValid()); + m_transitionWatchpointSet.add(watchpoint); + } + + void notifyTransitionFromThisStructure() const + { + m_transitionWatchpointSet.notifyWrite(); + } + static JS_EXPORTDATA const ClassInfo s_info; private: @@ -291,9 +315,11 @@ namespace JSC { OwnPtr<PropertyTable> m_propertyTable; - uint32_t m_propertyStorageCapacity; - WriteBarrier<JSString> m_objectToStringValue; + + mutable InlineWatchpointSet m_transitionWatchpointSet; + + uint32_t m_propertyStorageCapacity; // m_offset does not account for anonymous slots int m_offset; @@ -363,6 +389,9 @@ namespace JSC { { ASSERT(structure->typeInfo().overridesVisitChildren() == this->structure()->typeInfo().overridesVisitChildren()); ASSERT(structure->classInfo() == m_structure->classInfo()); + ASSERT(!m_structure + || m_structure->transitionWatchpointSetHasBeenInvalidated() + || m_structure.get() == structure); m_structure.set(globalData, this, structure); } @@ -382,10 +411,13 @@ namespace JSC { #if ENABLE(GC_VALIDATION) validate(cell); #endif - m_visitCount++; if (Heap::testAndSetMarked(cell) || !cell->structure()) return; + + m_visitCount++; + MARK_LOG_CHILD(*this, cell); + // Should never attempt to mark something that is zapped. ASSERT(!cell->isZapped()); |