Changeset 86499 in webkit
- Timestamp:
- May 14, 2011 3:10:01 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 66 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r86482 r86499 1 2011-05-13 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Geoffrey Garen. 4 5 Make GC validation more aggressive 6 https://bugs.webkit.org/show_bug.cgi?id=60802 7 8 This patch makes the checks performed under GC_VALIDATION 9 much more aggressive, and adds the checks to more places 10 in order to allow us to catch GC bugs much closer to the 11 point of failure. 12 13 * JavaScriptCore.exp: 14 * JavaScriptCore.xcodeproj/project.pbxproj: 15 * debugger/DebuggerActivation.cpp: 16 (JSC::DebuggerActivation::visitChildren): 17 * heap/MarkedBlock.cpp: 18 (JSC::MarkedBlock::MarkedBlock): 19 * heap/MarkedSpace.cpp: 20 * runtime/Arguments.cpp: 21 (JSC::Arguments::visitChildren): 22 * runtime/Executable.cpp: 23 (JSC::EvalExecutable::visitChildren): 24 (JSC::ProgramExecutable::visitChildren): 25 (JSC::FunctionExecutable::visitChildren): 26 * runtime/Executable.h: 27 * runtime/GetterSetter.cpp: 28 (JSC::GetterSetter::visitChildren): 29 * runtime/GetterSetter.h: 30 * runtime/JSAPIValueWrapper.h: 31 (JSC::JSAPIValueWrapper::createStructure): 32 (JSC::JSAPIValueWrapper::JSAPIValueWrapper): 33 * runtime/JSActivation.cpp: 34 (JSC::JSActivation::visitChildren): 35 * runtime/JSArray.cpp: 36 (JSC::JSArray::visitChildren): 37 * runtime/JSCell.cpp: 38 (JSC::slowValidateCell): 39 * runtime/JSCell.h: 40 (JSC::JSCell::JSCell::unvalidatedStructure): 41 (JSC::JSCell::JSCell::JSCell): 42 * runtime/JSFunction.cpp: 43 (JSC::JSFunction::visitChildren): 44 * runtime/JSGlobalObject.cpp: 45 (JSC::JSGlobalObject::visitChildren): 46 (JSC::slowValidateCell): 47 * runtime/JSONObject.h: 48 * runtime/JSObject.cpp: 49 (JSC::JSObject::visitChildren): 50 * runtime/JSPropertyNameIterator.cpp: 51 (JSC::JSPropertyNameIterator::visitChildren): 52 * runtime/JSPropertyNameIterator.h: 53 * runtime/JSStaticScopeObject.cpp: 54 (JSC::JSStaticScopeObject::visitChildren): 55 * runtime/JSString.h: 56 (JSC::RopeBuilder::JSString): 57 * runtime/JSWrapperObject.cpp: 58 (JSC::JSWrapperObject::visitChildren): 59 * runtime/NativeErrorConstructor.cpp: 60 (JSC::NativeErrorConstructor::visitChildren): 61 * runtime/PropertyMapHashTable.h: 62 (JSC::PropertyMapEntry::PropertyMapEntry): 63 * runtime/RegExpObject.cpp: 64 (JSC::RegExpObject::visitChildren): 65 * runtime/ScopeChain.cpp: 66 (JSC::ScopeChainNode::visitChildren): 67 * runtime/ScopeChain.h: 68 (JSC::ScopeChainNode::ScopeChainNode): 69 * runtime/Structure.cpp: 70 (JSC::Structure::Structure): 71 (JSC::Structure::addPropertyTransition): 72 (JSC::Structure::visitChildren): 73 * runtime/Structure.h: 74 (JSC::JSCell::classInfo): 75 * runtime/StructureChain.cpp: 76 (JSC::StructureChain::visitChildren): 77 * runtime/StructureChain.h: 78 * runtime/WriteBarrier.h: 79 (JSC::validateCell): 80 (JSC::JSCell): 81 (JSC::JSGlobalObject): 82 (JSC::WriteBarrierBase::set): 83 (JSC::WriteBarrierBase::setMayBeNull): 84 (JSC::WriteBarrierBase::setEarlyValue): 85 (JSC::WriteBarrierBase::get): 86 (JSC::WriteBarrierBase::operator*): 87 (JSC::WriteBarrierBase::operator->): 88 (JSC::WriteBarrierBase::unvalidatedGet): 89 (JSC::WriteBarrier::WriteBarrier): 90 * wtf/Assertions.h: 91 92 2011-05-13 Oliver Hunt <oliver@apple.com> 93 94 Reviewed by Geoffrey Garen. 95 96 Make GC validation more aggressive 97 https://bugs.webkit.org/show_bug.cgi?id=60802 98 99 This patch makes the checks performed under GC_VALIDATION 100 much more aggressive, and adds the checks to more places 101 in order to allow us to catch GC bugs much closer to the 102 point of failure. 103 104 * JavaScriptCore.exp: 105 * JavaScriptCore.xcodeproj/project.pbxproj: 106 * debugger/DebuggerActivation.cpp: 107 (JSC::DebuggerActivation::visitChildren): 108 * heap/MarkedBlock.cpp: 109 (JSC::MarkedBlock::MarkedBlock): 110 * heap/MarkedSpace.cpp: 111 * runtime/Arguments.cpp: 112 (JSC::Arguments::visitChildren): 113 * runtime/Executable.cpp: 114 (JSC::EvalExecutable::visitChildren): 115 (JSC::ProgramExecutable::visitChildren): 116 (JSC::FunctionExecutable::visitChildren): 117 * runtime/Executable.h: 118 * runtime/GetterSetter.cpp: 119 (JSC::GetterSetter::visitChildren): 120 * runtime/GetterSetter.h: 121 * runtime/JSAPIValueWrapper.h: 122 (JSC::JSAPIValueWrapper::createStructure): 123 (JSC::JSAPIValueWrapper::JSAPIValueWrapper): 124 * runtime/JSActivation.cpp: 125 (JSC::JSActivation::visitChildren): 126 * runtime/JSArray.cpp: 127 (JSC::JSArray::visitChildren): 128 * runtime/JSCell.cpp: 129 (JSC::slowValidateCell): 130 * runtime/JSCell.h: 131 (JSC::JSCell::JSCell::unvalidatedStructure): 132 (JSC::JSCell::JSCell::JSCell): 133 * runtime/JSFunction.cpp: 134 (JSC::JSFunction::visitChildren): 135 * runtime/JSGlobalObject.cpp: 136 (JSC::JSGlobalObject::visitChildren): 137 (JSC::slowValidateCell): 138 * runtime/JSONObject.h: 139 * runtime/JSObject.cpp: 140 (JSC::JSObject::visitChildren): 141 * runtime/JSPropertyNameIterator.cpp: 142 (JSC::JSPropertyNameIterator::visitChildren): 143 * runtime/JSPropertyNameIterator.h: 144 * runtime/JSStaticScopeObject.cpp: 145 (JSC::JSStaticScopeObject::visitChildren): 146 * runtime/JSString.h: 147 (JSC::RopeBuilder::JSString): 148 * runtime/JSWrapperObject.cpp: 149 (JSC::JSWrapperObject::visitChildren): 150 * runtime/NativeErrorConstructor.cpp: 151 (JSC::NativeErrorConstructor::visitChildren): 152 * runtime/PropertyMapHashTable.h: 153 (JSC::PropertyMapEntry::PropertyMapEntry): 154 * runtime/RegExpObject.cpp: 155 (JSC::RegExpObject::visitChildren): 156 * runtime/ScopeChain.cpp: 157 (JSC::ScopeChainNode::visitChildren): 158 * runtime/ScopeChain.h: 159 (JSC::ScopeChainNode::ScopeChainNode): 160 * runtime/Structure.cpp: 161 (JSC::Structure::Structure): 162 (JSC::Structure::addPropertyTransition): 163 (JSC::Structure::visitChildren): 164 * runtime/Structure.h: 165 (JSC::JSCell::classInfo): 166 * runtime/StructureChain.cpp: 167 (JSC::StructureChain::visitChildren): 168 * runtime/StructureChain.h: 169 * runtime/WriteBarrier.h: 170 (JSC::validateCell): 171 (JSC::JSCell): 172 (JSC::JSGlobalObject): 173 (JSC::WriteBarrierBase::set): 174 (JSC::WriteBarrierBase::setMayBeNull): 175 (JSC::WriteBarrierBase::setEarlyValue): 176 (JSC::WriteBarrierBase::get): 177 (JSC::WriteBarrierBase::operator*): 178 (JSC::WriteBarrierBase::operator->): 179 (JSC::WriteBarrierBase::unvalidatedGet): 180 (JSC::WriteBarrier::WriteBarrier): 181 * wtf/Assertions.h: 182 1 183 2011-05-14 Csaba Osztrogonác <ossy@webkit.org> 2 184 -
trunk/Source/JavaScriptCore/JavaScriptCore.exp
r86482 r86499 168 168 __ZN3JSC14SamplingThread4stopEv 169 169 __ZN3JSC14SamplingThread5startEj 170 __ZN3JSC14ScopeChainNode6s_infoE 170 171 __ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE 171 172 __ZN3JSC14TimeoutChecker5resetEv … … 184 185 __ZN3JSC16JSVariableObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE 185 186 __ZN3JSC16createRangeErrorEPNS_9ExecStateERKNS_7UStringE 187 __ZN3JSC16slowValidateCellEPNS_14JSGlobalObjectE 188 __ZN3JSC16slowValidateCellEPNS_6JSCellE 186 189 __ZN3JSC16throwSyntaxErrorEPNS_9ExecStateE 187 190 __ZN3JSC17BytecodeGenerator21setDumpsGeneratedCodeEb -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
r86482 r86499 318 318 ?size@Heap@JSC@@QBEIXZ 319 319 ?slowAppend@MarkedArgumentBuffer@JSC@@AAEXVJSValue@2@@Z 320 ?slowValidateCell@JSC@@YAXPAVJSCell@1@@Z 321 ?slowValidateCell@JSC@@YAXPAVJSGlobalObject@1@@Z 320 322 ?startProfiling@Profiler@JSC@@QAEXPAVExecState@2@ABVUString@2@@Z 321 323 ?startSampling@JSGlobalData@JSC@@QAEXXZ -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r86482 r86499 2701 2701 attributes = { 2702 2702 BuildIndependentTargetsInParallel = YES; 2703 LastUpgradeCheck = 0420; 2703 2704 }; 2704 2705 buildConfigurationList = 149C277108902AFE008A9EFC /* Build configuration list for PBXProject "JavaScriptCore" */; -
trunk/Source/JavaScriptCore/debugger/DebuggerActivation.cpp
r86482 r86499 41 41 void DebuggerActivation::visitChildren(SlotVisitor& visitor) 42 42 { 43 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 44 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 45 ASSERT(structure()->typeInfo().overridesVisitChildren()); 43 46 JSObject::visitChildren(visitor); 44 47 -
trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp
r86482 r86499 61 61 Structure* dummyMarkableCellStructure = globalData->dummyMarkableCellStructure.get(); 62 62 for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) 63 new (&atoms()[i]) JSCell(*globalData, dummyMarkableCellStructure );63 new (&atoms()[i]) JSCell(*globalData, dummyMarkableCellStructure, JSCell::CreatingEarlyCell); 64 64 } 65 65 -
trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp
r86482 r86499 22 22 #include "MarkedSpace.h" 23 23 24 #include "JSGlobalObject.h" 24 25 #include "JSCell.h" 25 26 #include "JSGlobalData.h" -
trunk/Source/JavaScriptCore/runtime/Arguments.cpp
r86482 r86499 46 46 void Arguments::visitChildren(SlotVisitor& visitor) 47 47 { 48 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 49 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 50 ASSERT(structure()->typeInfo().overridesVisitChildren()); 48 51 JSObject::visitChildren(visitor); 49 52 -
trunk/Source/JavaScriptCore/runtime/Executable.cpp
r86482 r86499 146 146 void EvalExecutable::visitChildren(SlotVisitor& visitor) 147 147 { 148 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 149 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 150 ASSERT(structure()->typeInfo().overridesVisitChildren()); 148 151 ScriptExecutable::visitChildren(visitor); 149 152 if (m_evalCodeBlock) … … 238 241 void ProgramExecutable::visitChildren(SlotVisitor& visitor) 239 242 { 243 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 244 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 245 ASSERT(structure()->typeInfo().overridesVisitChildren()); 240 246 ScriptExecutable::visitChildren(visitor); 241 247 if (m_programCodeBlock) … … 350 356 void FunctionExecutable::visitChildren(SlotVisitor& visitor) 351 357 { 358 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 359 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 360 ASSERT(structure()->typeInfo().overridesVisitChildren()); 352 361 ScriptExecutable::visitChildren(visitor); 353 362 if (m_codeBlockForCall) -
trunk/Source/JavaScriptCore/runtime/Executable.h
r86482 r86499 67 67 68 68 static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { return Structure::create(globalData, proto, TypeInfo(CompoundType, StructureFlags), AnonymousSlotCount, &s_info); } 69 70 static const ClassInfo s_info; 69 71 70 72 protected: 71 73 static const unsigned StructureFlags = 0; 72 static const ClassInfo s_info;73 74 int m_numParametersForCall; 74 75 int m_numParametersForConstruct; … … 118 119 119 120 static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { return Structure::create(globalData, proto, TypeInfo(LeafType, StructureFlags), AnonymousSlotCount, &s_info); } 120 121 122 static const ClassInfo s_info; 123 121 124 private: 122 125 #if ENABLE(JIT) … … 144 147 // trampoline. It may be easier to make NativeFunction be passed 'this' as a part of the ArgList. 145 148 NativeFunction m_constructor; 146 static const ClassInfo s_info;147 149 }; 148 150 … … 237 239 return Structure::create(globalData, proto, TypeInfo(CompoundType, StructureFlags), AnonymousSlotCount, &s_info); 238 240 } 239 241 242 static const ClassInfo s_info; 240 243 private: 241 244 static const unsigned StructureFlags = OverridesVisitChildren | ScriptExecutable::StructureFlags; 242 static const ClassInfo s_info;243 245 EvalExecutable(ExecState*, const SourceCode&, bool); 244 246 … … 287 289 return Structure::create(globalData, proto, TypeInfo(CompoundType, StructureFlags), AnonymousSlotCount, &s_info); 288 290 } 291 292 static const ClassInfo s_info; 289 293 290 294 private: 291 295 static const unsigned StructureFlags = OverridesVisitChildren | ScriptExecutable::StructureFlags; 292 static const ClassInfo s_info;293 296 ProgramExecutable(ExecState*, const SourceCode&); 294 297 … … 383 386 return Structure::create(globalData, proto, TypeInfo(CompoundType, StructureFlags), AnonymousSlotCount, &s_info); 384 387 } 388 389 static const ClassInfo s_info; 385 390 386 391 private: … … 392 397 393 398 static const unsigned StructureFlags = OverridesVisitChildren | ScriptExecutable::StructureFlags; 394 static const ClassInfo s_info;395 399 unsigned m_numCapturedVariables : 31; 396 400 bool m_forceUsesArguments : 1; -
trunk/Source/JavaScriptCore/runtime/GetterSetter.cpp
r86482 r86499 33 33 void GetterSetter::visitChildren(SlotVisitor& visitor) 34 34 { 35 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 36 ASSERT(structure()->typeInfo().overridesVisitChildren()); 35 37 JSCell::visitChildren(visitor); 36 38 -
trunk/Source/JavaScriptCore/runtime/GetterSetter.h
r86482 r86499 53 53 return Structure::create(globalData, prototype, TypeInfo(GetterSetterType, OverridesVisitChildren), AnonymousSlotCount, &s_info); 54 54 } 55 56 static const ClassInfo s_info; 57 55 58 private: 56 59 virtual bool isGetterSetter() const; 57 static const ClassInfo s_info;58 60 59 61 WriteBarrier<JSObject> m_getter; -
trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h
r86482 r86499 41 41 return Structure::create(globalData, prototype, TypeInfo(CompoundType, OverridesVisitChildren | OverridesGetPropertyNames), AnonymousSlotCount, &s_info); 42 42 } 43 44 static const ClassInfo s_info; 43 45 44 45 46 private: 46 47 JSAPIValueWrapper(ExecState* exec, JSValue value) … … 50 51 ASSERT(!value.isCell()); 51 52 } 52 static const ClassInfo s_info;53 53 54 54 WriteBarrier<Unknown> m_value; -
trunk/Source/JavaScriptCore/runtime/JSActivation.cpp
r86482 r86499 61 61 void JSActivation::visitChildren(SlotVisitor& visitor) 62 62 { 63 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 64 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 65 ASSERT(structure()->typeInfo().overridesVisitChildren()); 63 66 Base::visitChildren(visitor); 64 67 -
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r86482 r86499 860 860 void JSArray::visitChildren(SlotVisitor& visitor) 861 861 { 862 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 863 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 864 ASSERT(structure()->typeInfo().overridesVisitChildren()); 862 865 visitChildrenDirect(visitor); 863 866 } -
trunk/Source/JavaScriptCore/runtime/JSCell.cpp
r86482 r86499 222 222 } 223 223 224 void slowValidateCell(JSCell* cell) 225 { 226 ASSERT_GC_OBJECT_LOOKS_VALID(cell); 227 } 228 224 229 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r86482 r86499 72 72 friend class Structure; 73 73 friend class StructureChain; 74 enum CreatingEarlyCellTag { CreatingEarlyCell }; 74 75 75 76 protected: … … 79 80 explicit JSCell(VPtrStealingHackType) { } 80 81 JSCell(JSGlobalData&, Structure*); 82 JSCell(JSGlobalData&, Structure*, CreatingEarlyCellTag); 81 83 virtual ~JSCell(); 82 84 static const ClassInfo s_dummyCellInfo; … … 149 151 } 150 152 153 #if ENABLE(GC_VALIDATION) 154 Structure* unvalidatedStructure() { return m_structure.unvalidatedGet(); } 155 #endif 156 151 157 protected: 152 158 static const unsigned AnonymousSlotCount = 0; … … 163 169 : m_structure(globalData, this, structure) 164 170 { 171 ASSERT(m_structure); 172 } 173 174 inline JSCell::JSCell(JSGlobalData& globalData, Structure* structure, CreatingEarlyCellTag) 175 { 176 #if ENABLE(GC_VALIDATION) 177 if (structure) 178 #endif 179 m_structure.setEarlyValue(globalData, this, structure); 165 180 // Very first set of allocations won't have a real structure. 166 181 ASSERT(m_structure || !globalData.dummyMarkableCellStructure); -
trunk/Source/JavaScriptCore/runtime/JSFunction.cpp
r86482 r86499 136 136 void JSFunction::visitChildren(SlotVisitor& visitor) 137 137 { 138 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 139 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 140 ASSERT(structure()->typeInfo().overridesVisitChildren()); 138 141 Base::visitChildren(visitor); 139 142 -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r86482 r86499 311 311 void JSGlobalObject::visitChildren(SlotVisitor& visitor) 312 312 { 313 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 314 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 315 ASSERT(structure()->typeInfo().overridesVisitChildren()); 313 316 JSVariableObject::visitChildren(visitor); 314 317 … … 460 463 } 461 464 465 void slowValidateCell(JSGlobalObject* globalObject) 466 { 467 if (!globalObject->isGlobalObject()) 468 CRASH(); 469 ASSERT_GC_OBJECT_INHERITS(globalObject, &JSGlobalObject::s_info); 470 } 471 462 472 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/JSONObject.h
r86482 r86499 41 41 return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); 42 42 } 43 44 static const ClassInfo s_info; 43 45 44 46 protected: … … 49 51 virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); 50 52 51 static const ClassInfo s_info;52 53 }; 53 54 -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r86482 r86499 71 71 void JSObject::visitChildren(SlotVisitor& visitor) 72 72 { 73 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 73 74 #ifndef NDEBUG 74 75 bool wasCheckingForDefaultMarkViolation = visitor.m_isCheckingForDefaultMarkViolation; -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
r86482 r86499 98 98 void JSPropertyNameIterator::visitChildren(SlotVisitor& visitor) 99 99 { 100 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 101 ASSERT(structure()->typeInfo().overridesVisitChildren()); 100 102 visitor.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues); 101 103 if (m_cachedPrototypeChain) -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.h
r86482 r86499 76 76 void setCachedPrototypeChain(JSGlobalData& globalData, StructureChain* cachedPrototypeChain) { m_cachedPrototypeChain.set(globalData, this, cachedPrototypeChain); } 77 77 StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); } 78 79 static const ClassInfo s_info; 78 80 79 81 private: 80 static const ClassInfo s_info;81 82 JSPropertyNameIterator(ExecState*, PropertyNameArrayData* propertyNameArrayData, size_t numCacheableSlot); 82 83 -
trunk/Source/JavaScriptCore/runtime/JSStaticScopeObject.cpp
r86482 r86499 35 35 void JSStaticScopeObject::visitChildren(SlotVisitor& visitor) 36 36 { 37 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 38 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 39 ASSERT(structure()->typeInfo().overridesVisitChildren()); 37 40 JSVariableObject::visitChildren(visitor); 38 41 visitor.append(&m_registerStore); -
trunk/Source/JavaScriptCore/runtime/JSString.h
r86482 r86499 331 331 return Structure::create(globalData, proto, TypeInfo(StringType, OverridesGetOwnPropertySlot | NeedsThisConversion), AnonymousSlotCount, &s_info); 332 332 } 333 334 static const ClassInfo s_info; 333 335 334 336 private: … … 338 340 { 339 341 } 340 static const ClassInfo s_info;341 342 342 343 void resolveRope(ExecState*) const; -
trunk/Source/JavaScriptCore/runtime/JSWrapperObject.cpp
r86482 r86499 29 29 void JSWrapperObject::visitChildren(SlotVisitor& visitor) 30 30 { 31 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 32 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 33 ASSERT(structure()->typeInfo().overridesVisitChildren()); 31 34 JSObject::visitChildren(visitor); 32 35 if (m_internalValue) -
trunk/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp
r86482 r86499 49 49 void NativeErrorConstructor::visitChildren(SlotVisitor& visitor) 50 50 { 51 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 52 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 53 ASSERT(structure()->typeInfo().overridesVisitChildren()); 51 54 InternalFunction::visitChildren(visitor); 52 55 if (m_errorStructure) -
trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h
r86482 r86499 81 81 , offset(offset) 82 82 , attributes(attributes) 83 , specificValue(globalData, owner, specificValue )83 , specificValue(globalData, owner, specificValue, WriteBarrier<JSCell>::MayBeNull) 84 84 { 85 85 } -
trunk/Source/JavaScriptCore/runtime/RegExpObject.cpp
r86482 r86499 75 75 void RegExpObject::visitChildren(SlotVisitor& visitor) 76 76 { 77 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 78 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 79 ASSERT(structure()->typeInfo().overridesVisitChildren()); 77 80 Base::visitChildren(visitor); 78 81 if (UNLIKELY(!d->lastIndex.get().isInt32())) -
trunk/Source/JavaScriptCore/runtime/ScopeChain.cpp
r86482 r86499 70 70 void ScopeChainNode::visitChildren(SlotVisitor& visitor) 71 71 { 72 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 73 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 74 ASSERT(structure()->typeInfo().overridesVisitChildren()); 72 75 if (next) 73 76 visitor.append(&next); -
trunk/Source/JavaScriptCore/runtime/ScopeChain.h
r86482 r86499 40 40 : JSCell(*globalData, globalData->scopeChainNodeStructure.get()) 41 41 , globalData(globalData) 42 , next(*globalData, this, next )42 , next(*globalData, this, next, WriteBarrier<ScopeChainNode>::MayBeNull) 43 43 , object(*globalData, this, object) 44 44 , globalObject(*globalData, this, globalObject) … … 69 69 static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { return Structure::create(globalData, proto, TypeInfo(CompoundType, StructureFlags), AnonymousSlotCount, &s_info); } 70 70 virtual void visitChildren(SlotVisitor&); 71 static JS_EXPORTDATA const ClassInfo s_info; 72 71 73 private: 72 74 static const unsigned StructureFlags = OverridesVisitChildren; 73 static const ClassInfo s_info;74 75 }; 75 76 -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r86482 r86499 207 207 208 208 Structure::Structure(JSGlobalData& globalData) 209 : JSCell(globalData, this )209 : JSCell(globalData, this, CreatingEarlyCell) 210 210 , m_typeInfo(CompoundType, OverridesVisitChildren) 211 211 , m_prototype(globalData, this, jsNull()) … … 359 359 Structure* transition = create(globalData, structure); 360 360 361 transition->m_cachedPrototypeChain.set (globalData, transition, structure->m_cachedPrototypeChain.get());361 transition->m_cachedPrototypeChain.setMayBeNull(globalData, transition, structure->m_cachedPrototypeChain.get()); 362 362 transition->m_previous.set(globalData, transition, structure); 363 363 transition->m_nameInPrevious = propertyName.impl(); 364 364 transition->m_attributesInPrevious = attributes; 365 transition->m_specificValueInPrevious.set (globalData, transition, specificValue);365 transition->m_specificValueInPrevious.setMayBeNull(globalData, transition, specificValue); 366 366 367 367 if (structure->m_propertyTable) { … … 780 780 void Structure::visitChildren(SlotVisitor& visitor) 781 781 { 782 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 783 ASSERT(structure()->typeInfo().overridesVisitChildren()); 782 784 JSCell::visitChildren(visitor); 783 785 if (m_prototype) -
trunk/Source/JavaScriptCore/runtime/Structure.h
r86482 r86499 161 161 return new (&globalData) Structure(globalData); 162 162 } 163 164 static JS_EXPORTDATA const ClassInfo s_info; 163 165 164 166 private: … … 173 175 } 174 176 175 static JS_EXPORTDATA const ClassInfo s_info;176 177 177 typedef enum { 178 178 NoneDictionaryKind = 0, … … 279 279 inline const ClassInfo* JSCell::classInfo() const 280 280 { 281 #if ENABLE(GC_VALIDATION) 282 return m_structure.unvalidatedGet()->classInfo(); 283 #else 281 284 return m_structure->classInfo(); 285 #endif 282 286 } 283 287 -
trunk/Source/JavaScriptCore/runtime/StructureChain.cpp
r86482 r86499 56 56 void StructureChain::visitChildren(SlotVisitor& visitor) 57 57 { 58 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 59 ASSERT(structure()->typeInfo().overridesVisitChildren()); 58 60 size_t i = 0; 59 61 while (m_vector[i]) -
trunk/Source/JavaScriptCore/runtime/StructureChain.h
r86482 r86499 48 48 49 49 static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) { return Structure::create(globalData, prototype, TypeInfo(CompoundType, OverridesVisitChildren), 0, &s_info); } 50 51 static ClassInfo s_info; 50 52 51 53 private: … … 53 55 ~StructureChain(); 54 56 OwnArrayPtr<WriteBarrier<Structure> > m_vector; 55 static ClassInfo s_info;56 57 }; 57 58 -
trunk/Source/JavaScriptCore/runtime/WriteBarrier.h
r86482 r86499 29 29 #include "HandleTypes.h" 30 30 #include "Heap.h" 31 #include "TypeTraits.h" 31 32 32 33 namespace JSC { … … 34 35 class JSCell; 35 36 class JSGlobalData; 37 class JSGlobalObject; 36 38 37 39 template<class T> class WriteBarrierBase; 38 40 template<> class WriteBarrierBase<JSValue>; 39 41 42 void slowValidateCell(JSCell*); 43 void slowValidateCell(JSGlobalObject*); 44 45 #if ENABLE(GC_VALIDATION) 46 template<class T> inline void validateCell(T cell) 47 { 48 ASSERT_GC_OBJECT_INHERITS(cell, &WTF::RemovePointer<T>::Type::s_info); 49 } 50 51 template<> inline void validateCell<JSCell*>(JSCell* cell) 52 { 53 slowValidateCell(cell); 54 } 55 56 template<> inline void validateCell<JSGlobalObject*>(JSGlobalObject* globalObject) 57 { 58 slowValidateCell(globalObject); 59 } 60 #else 61 template<class T> inline void validateCell(T) 62 { 63 } 64 #endif 65 40 66 // We have a separate base class with no constructors for use in Unions. 41 67 template <typename T> class WriteBarrierBase { 42 68 public: 43 void set(JSGlobalData&, const JSCell* owner, T* value) 69 void set(JSGlobalData& globalData, const JSCell* owner, T* value) 70 { 71 ASSERT(value); 72 validateCell(value); 73 setEarlyValue(globalData, owner, value); 74 } 75 76 void setMayBeNull(JSGlobalData& globalData, const JSCell* owner, T* value) 77 { 78 if (value) 79 validateCell(value); 80 setEarlyValue(globalData, owner, value); 81 } 82 83 // Should only be used by JSCell during early initialisation 84 // when some basic types aren't yet completely instantiated 85 void setEarlyValue(JSGlobalData&, const JSCell* owner, T* value) 44 86 { 45 87 this->m_cell = reinterpret_cast<JSCell*>(value); … … 53 95 T* get() const 54 96 { 97 if (m_cell) 98 validateCell(m_cell); 55 99 return reinterpret_cast<T*>(m_cell); 56 100 } … … 62 106 ASSERT(!isZombie(m_cell)); 63 107 #endif 108 validateCell<T>(static_cast<T*>(m_cell)); 64 109 return static_cast<T*>(m_cell); 65 110 } … … 68 113 { 69 114 ASSERT(m_cell); 115 validateCell(static_cast<T*>(m_cell)); 70 116 return static_cast<T*>(m_cell); 71 117 } … … 87 133 #endif 88 134 } 135 136 #if ENABLE(GC_VALIDATION) 137 T* unvalidatedGet() const { return reinterpret_cast<T*>(m_cell); } 138 #endif 89 139 90 140 private: … … 152 202 this->set(globalData, owner, value); 153 203 } 204 205 enum MayBeNullTag { MayBeNull }; 206 WriteBarrier(JSGlobalData& globalData, const JSCell* owner, T* value, MayBeNullTag) 207 { 208 this->setMayBeNull(globalData, owner, value); 209 } 154 210 }; 155 211 -
trunk/Source/JavaScriptCore/wtf/Assertions.h
r86482 r86499 380 380 #endif 381 381 382 #if ENABLE(GC_VALIDATION) 383 #define ASSERT_GC_OBJECT_LOOKS_VALID(cell) do { \ 384 if (!(cell))\ 385 CRASH();\ 386 if (cell->unvalidatedStructure()->unvalidatedStructure() != cell->unvalidatedStructure()->unvalidatedStructure()->unvalidatedStructure())\ 387 CRASH();\ 388 } while (0) 389 390 #define ASSERT_GC_OBJECT_INHERITS(object, classInfo) do {\ 391 ASSERT_GC_OBJECT_LOOKS_VALID(object); \ 392 if (!object->inherits(classInfo)) \ 393 CRASH();\ 394 } while (0) 395 396 #else 397 #define ASSERT_GC_OBJECT_LOOKS_VALID(cell) do { (void)cell; } while (0) 398 #define ASSERT_GC_OBJECT_INHERITS(object, classInfo) do { (void)object; (void)classInfo; } while (0) 399 #endif 400 382 401 #endif /* WTF_Assertions_h */ -
trunk/Source/WebCore/ChangeLog
r86498 r86499 1 2011-05-13 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Geoffrey Garen. 4 5 Make GC validation more aggressive 6 https://bugs.webkit.org/show_bug.cgi?id=60802 7 8 This makes GC_VALIDATION much more aggressive in webcore, 9 adding logic to every visitChildren method to ensure that 10 the structure still has correct flags. 11 12 Additionally every function generated for the dom bindings 13 makes use of the new GC_VALIDATION object assertions to further 14 ensure that the object appears to be sensible. 15 16 * bindings/js/JSAttrCustom.cpp: 17 (WebCore::JSAttr::visitChildren): 18 * bindings/js/JSAudioContextCustom.cpp: 19 (WebCore::JSAudioContext::visitChildren): 20 * bindings/js/JSCSSRuleCustom.cpp: 21 (WebCore::JSCSSRule::visitChildren): 22 * bindings/js/JSCSSStyleDeclarationCustom.cpp: 23 (WebCore::JSCSSStyleDeclaration::visitChildren): 24 * bindings/js/JSCanvasRenderingContextCustom.cpp: 25 (WebCore::JSCanvasRenderingContext::visitChildren): 26 * bindings/js/JSDOMGlobalObject.cpp: 27 (WebCore::JSDOMGlobalObject::visitChildren): 28 (WebCore::JSDOMGlobalObject::setInjectedScript): 29 * bindings/js/JSDOMWindowCustom.cpp: 30 (WebCore::JSDOMWindow::visitChildren): 31 * bindings/js/JSDOMWindowShell.cpp: 32 (WebCore::JSDOMWindowShell::visitChildren): 33 * bindings/js/JSEventListener.cpp: 34 (WebCore::JSEventListener::JSEventListener): 35 * bindings/js/JSEventListener.h: 36 (WebCore::JSEventListener::jsFunction): 37 * bindings/js/JSJavaScriptAudioNodeCustom.cpp: 38 (WebCore::JSJavaScriptAudioNode::visitChildren): 39 * bindings/js/JSMessageChannelCustom.cpp: 40 (WebCore::JSMessageChannel::visitChildren): 41 * bindings/js/JSMessagePortCustom.cpp: 42 (WebCore::JSMessagePort::visitChildren): 43 * bindings/js/JSNamedNodeMapCustom.cpp: 44 (WebCore::JSNamedNodeMap::visitChildren): 45 * bindings/js/JSNodeCustom.cpp: 46 (WebCore::JSNode::visitChildren): 47 * bindings/js/JSNodeFilterCustom.cpp: 48 (WebCore::JSNodeFilter::visitChildren): 49 * bindings/js/JSNodeIteratorCustom.cpp: 50 (WebCore::JSNodeIterator::visitChildren): 51 * bindings/js/JSSVGElementInstanceCustom.cpp: 52 (WebCore::JSSVGElementInstance::visitChildren): 53 * bindings/js/JSSharedWorkerCustom.cpp: 54 (WebCore::JSSharedWorker::visitChildren): 55 * bindings/js/JSStyleSheetCustom.cpp: 56 (WebCore::JSStyleSheet::visitChildren): 57 * bindings/js/JSTreeWalkerCustom.cpp: 58 (WebCore::JSTreeWalker::visitChildren): 59 * bindings/js/JSWebGLRenderingContextCustom.cpp: 60 (WebCore::JSWebGLRenderingContext::visitChildren): 61 * bindings/js/JSWorkerContextCustom.cpp: 62 (WebCore::JSWorkerContext::visitChildren): 63 * bindings/js/JSXMLHttpRequestCustom.cpp: 64 (WebCore::JSXMLHttpRequest::visitChildren): 65 * bindings/js/JSXPathResultCustom.cpp: 66 (WebCore::JSXPathResult::visitChildren): 67 * bindings/scripts/CodeGeneratorJS.pm: 68 69 2011-05-13 Oliver Hunt <oliver@apple.com> 70 71 Reviewed by Geoffrey Garen. 72 73 Make GC validation more aggressive 74 https://bugs.webkit.org/show_bug.cgi?id=60802 75 76 This makes GC_VALIDATION much more aggressive in webcore, 77 adding logic to every visitChildren method to ensure that 78 the structure still has correct flags. 79 80 Additionally every function generated for the dom bindings 81 makes use of the new GC_VALIDATION object assertions to further 82 ensure that the object appears to be sensible. 83 84 * bindings/js/JSAttrCustom.cpp: 85 (WebCore::JSAttr::visitChildren): 86 * bindings/js/JSAudioContextCustom.cpp: 87 (WebCore::JSAudioContext::visitChildren): 88 * bindings/js/JSCSSRuleCustom.cpp: 89 (WebCore::JSCSSRule::visitChildren): 90 * bindings/js/JSCSSStyleDeclarationCustom.cpp: 91 (WebCore::JSCSSStyleDeclaration::visitChildren): 92 * bindings/js/JSCanvasRenderingContextCustom.cpp: 93 (WebCore::JSCanvasRenderingContext::visitChildren): 94 * bindings/js/JSDOMGlobalObject.cpp: 95 (WebCore::JSDOMGlobalObject::visitChildren): 96 (WebCore::JSDOMGlobalObject::setInjectedScript): 97 * bindings/js/JSDOMWindowCustom.cpp: 98 (WebCore::JSDOMWindow::visitChildren): 99 * bindings/js/JSDOMWindowShell.cpp: 100 (WebCore::JSDOMWindowShell::visitChildren): 101 * bindings/js/JSEventListener.cpp: 102 (WebCore::JSEventListener::JSEventListener): 103 * bindings/js/JSEventListener.h: 104 (WebCore::JSEventListener::jsFunction): 105 * bindings/js/JSJavaScriptAudioNodeCustom.cpp: 106 (WebCore::JSJavaScriptAudioNode::visitChildren): 107 * bindings/js/JSMessageChannelCustom.cpp: 108 (WebCore::JSMessageChannel::visitChildren): 109 * bindings/js/JSMessagePortCustom.cpp: 110 (WebCore::JSMessagePort::visitChildren): 111 * bindings/js/JSNamedNodeMapCustom.cpp: 112 (WebCore::JSNamedNodeMap::visitChildren): 113 * bindings/js/JSNodeCustom.cpp: 114 (WebCore::JSNode::visitChildren): 115 * bindings/js/JSNodeFilterCustom.cpp: 116 (WebCore::JSNodeFilter::visitChildren): 117 * bindings/js/JSNodeIteratorCustom.cpp: 118 (WebCore::JSNodeIterator::visitChildren): 119 * bindings/js/JSSVGElementInstanceCustom.cpp: 120 (WebCore::JSSVGElementInstance::visitChildren): 121 * bindings/js/JSSharedWorkerCustom.cpp: 122 (WebCore::JSSharedWorker::visitChildren): 123 * bindings/js/JSStyleSheetCustom.cpp: 124 (WebCore::JSStyleSheet::visitChildren): 125 * bindings/js/JSTreeWalkerCustom.cpp: 126 (WebCore::JSTreeWalker::visitChildren): 127 * bindings/js/JSWebGLRenderingContextCustom.cpp: 128 (WebCore::JSWebGLRenderingContext::visitChildren): 129 * bindings/js/JSWorkerContextCustom.cpp: 130 (WebCore::JSWorkerContext::visitChildren): 131 * bindings/js/JSXMLHttpRequestCustom.cpp: 132 (WebCore::JSXMLHttpRequest::visitChildren): 133 * bindings/js/JSXPathResultCustom.cpp: 134 (WebCore::JSXPathResult::visitChildren): 135 * bindings/scripts/CodeGeneratorJS.pm: 136 1 137 2011-05-14 Oliver Hunt <oliver@apple.com> 2 138 -
trunk/Source/WebCore/bindings/js/JSAttrCustom.cpp
r86482 r86499 42 42 void JSAttr::visitChildren(SlotVisitor& visitor) 43 43 { 44 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 45 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 46 ASSERT(structure()->typeInfo().overridesVisitChildren()); 44 47 Base::visitChildren(visitor); 45 48 -
trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
r86482 r86499 42 42 void JSAudioContext::visitChildren(SlotVisitor& visitor) 43 43 { 44 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 45 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 46 ASSERT(structure()->typeInfo().overridesVisitChildren()); 44 47 Base::visitChildren(visitor); 45 48 m_impl->visitJSEventListeners(visitor); -
trunk/Source/WebCore/bindings/js/JSCSSRuleCustom.cpp
r86482 r86499 51 51 void JSCSSRule::visitChildren(SlotVisitor& visitor) 52 52 { 53 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 54 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 55 ASSERT(structure()->typeInfo().overridesVisitChildren()); 53 56 Base::visitChildren(visitor); 54 57 visitor.addOpaqueRoot(root(impl())); -
trunk/Source/WebCore/bindings/js/JSCSSStyleDeclarationCustom.cpp
r86482 r86499 47 47 void JSCSSStyleDeclaration::visitChildren(SlotVisitor& visitor) 48 48 { 49 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 50 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 51 ASSERT(structure()->typeInfo().overridesVisitChildren()); 49 52 Base::visitChildren(visitor); 50 53 visitor.addOpaqueRoot(root(impl())); -
trunk/Source/WebCore/bindings/js/JSCanvasRenderingContextCustom.cpp
r86482 r86499 42 42 void JSCanvasRenderingContext::visitChildren(SlotVisitor& visitor) 43 43 { 44 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 45 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 46 ASSERT(structure()->typeInfo().overridesVisitChildren()); 44 47 Base::visitChildren(visitor); 45 48 -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
r86482 r86499 53 53 void JSDOMGlobalObject::visitChildren(SlotVisitor& visitor) 54 54 { 55 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 56 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 57 ASSERT(structure()->typeInfo().overridesVisitChildren()); 55 58 Base::visitChildren(visitor); 56 59 … … 79 82 void JSDOMGlobalObject::setInjectedScript(JSObject* injectedScript) 80 83 { 81 m_injectedScript.set (globalData(), this, injectedScript);84 m_injectedScript.setMayBeNull(globalData(), this, injectedScript); 82 85 } 83 86 -
trunk/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp
r86482 r86499 75 75 void JSDOMWindow::visitChildren(SlotVisitor& visitor) 76 76 { 77 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 78 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 79 ASSERT(structure()->typeInfo().overridesVisitChildren()); 77 80 Base::visitChildren(visitor); 78 81 -
trunk/Source/WebCore/bindings/js/JSDOMWindowShell.cpp
r86482 r86499 76 76 void JSDOMWindowShell::visitChildren(SlotVisitor& visitor) 77 77 { 78 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 79 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 80 ASSERT(structure()->typeInfo().overridesVisitChildren()); 78 81 Base::visitChildren(visitor); 79 82 if (m_window) -
trunk/Source/WebCore/bindings/js/JSEventListener.cpp
r86482 r86499 41 41 { 42 42 if (wrapper) 43 m_jsFunction.set (*m_isolatedWorld->globalData(), wrapper, function);43 m_jsFunction.setMayBeNull(*m_isolatedWorld->globalData(), wrapper, function); 44 44 else 45 45 ASSERT(!function); -
trunk/Source/WebCore/bindings/js/JSEventListener.h
r86482 r86499 76 76 { 77 77 if (!m_jsFunction) 78 m_jsFunction.set (*scriptExecutionContext->globalData(), m_wrapper.get(), initializeJSFunction(scriptExecutionContext));78 m_jsFunction.setMayBeNull(*scriptExecutionContext->globalData(), m_wrapper.get(), initializeJSFunction(scriptExecutionContext)); 79 79 80 80 // Verify that we have a valid wrapper protecting our function from -
trunk/Source/WebCore/bindings/js/JSJavaScriptAudioNodeCustom.cpp
r86482 r86499 37 37 void JSJavaScriptAudioNode::visitChildren(SlotVisitor& visitor) 38 38 { 39 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 40 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 41 ASSERT(structure()->typeInfo().overridesVisitChildren()); 39 42 Base::visitChildren(visitor); 40 43 static_cast<JavaScriptAudioNode*>(impl())->visitJSEventListeners(visitor); -
trunk/Source/WebCore/bindings/js/JSMessageChannelCustom.cpp
r86482 r86499 36 36 void JSMessageChannel::visitChildren(SlotVisitor& visitor) 37 37 { 38 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 39 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 40 ASSERT(structure()->typeInfo().overridesVisitChildren()); 38 41 Base::visitChildren(visitor); 39 42 -
trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp
r86482 r86499 44 44 void JSMessagePort::visitChildren(SlotVisitor& visitor) 45 45 { 46 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 47 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 48 ASSERT(structure()->typeInfo().overridesVisitChildren()); 46 49 Base::visitChildren(visitor); 47 50 -
trunk/Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp
r86482 r86499 49 49 void JSNamedNodeMap::visitChildren(SlotVisitor& visitor) 50 50 { 51 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 52 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 53 ASSERT(structure()->typeInfo().overridesVisitChildren()); 51 54 Base::visitChildren(visitor); 52 55 -
trunk/Source/WebCore/bindings/js/JSNodeCustom.cpp
r86482 r86499 195 195 void JSNode::visitChildren(SlotVisitor& visitor) 196 196 { 197 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 198 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 199 ASSERT(structure()->typeInfo().overridesVisitChildren()); 197 200 Base::visitChildren(visitor); 198 201 -
trunk/Source/WebCore/bindings/js/JSNodeFilterCustom.cpp
r86482 r86499 39 39 void JSNodeFilter::visitChildren(SlotVisitor& visitor) 40 40 { 41 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 42 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 43 ASSERT(structure()->typeInfo().overridesVisitChildren()); 41 44 Base::visitChildren(visitor); 42 45 visitor.addOpaqueRoot(impl()); -
trunk/Source/WebCore/bindings/js/JSNodeIteratorCustom.cpp
r86482 r86499 32 32 void JSNodeIterator::visitChildren(SlotVisitor& visitor) 33 33 { 34 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 35 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 36 ASSERT(structure()->typeInfo().overridesVisitChildren()); 34 37 Base::visitChildren(visitor); 35 38 -
trunk/Source/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp
r86482 r86499 36 36 void JSSVGElementInstance::visitChildren(JSC::SlotVisitor& visitor) 37 37 { 38 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 39 COMPILE_ASSERT(StructureFlags & JSC::OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 40 ASSERT(structure()->typeInfo().overridesVisitChildren()); 38 41 Base::visitChildren(visitor); 39 42 visitor.addOpaqueRoot(root(impl()->correspondingElement())); -
trunk/Source/WebCore/bindings/js/JSSharedWorkerCustom.cpp
r86482 r86499 46 46 void JSSharedWorker::visitChildren(SlotVisitor& visitor) 47 47 { 48 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 49 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 50 ASSERT(structure()->typeInfo().overridesVisitChildren()); 48 51 Base::visitChildren(visitor); 49 52 -
trunk/Source/WebCore/bindings/js/JSStyleSheetCustom.cpp
r86482 r86499 38 38 void JSStyleSheet::visitChildren(SlotVisitor& visitor) 39 39 { 40 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 41 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 42 ASSERT(structure()->typeInfo().overridesVisitChildren()); 40 43 Base::visitChildren(visitor); 41 44 visitor.addOpaqueRoot(root(impl())); -
trunk/Source/WebCore/bindings/js/JSTreeWalkerCustom.cpp
r86482 r86499 32 32 void JSTreeWalker::visitChildren(SlotVisitor& visitor) 33 33 { 34 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 35 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 36 ASSERT(structure()->typeInfo().overridesVisitChildren()); 34 37 Base::visitChildren(visitor); 35 38 -
trunk/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp
r86482 r86499 195 195 void JSWebGLRenderingContext::visitChildren(SlotVisitor& visitor) 196 196 { 197 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 198 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 199 ASSERT(structure()->typeInfo().overridesVisitChildren()); 197 200 Base::visitChildren(visitor); 198 201 visitor.addOpaqueRoot(impl()); -
trunk/Source/WebCore/bindings/js/JSWorkerContextCustom.cpp
r86482 r86499 56 56 void JSWorkerContext::visitChildren(SlotVisitor& visitor) 57 57 { 58 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 59 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 60 ASSERT(structure()->typeInfo().overridesVisitChildren()); 58 61 Base::visitChildren(visitor); 59 62 -
trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
r86482 r86499 57 57 void JSXMLHttpRequest::visitChildren(SlotVisitor& visitor) 58 58 { 59 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 60 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 61 ASSERT(structure()->typeInfo().overridesVisitChildren()); 59 62 Base::visitChildren(visitor); 60 63 -
trunk/Source/WebCore/bindings/js/JSXPathResultCustom.cpp
r86482 r86499 39 39 void JSXPathResult::visitChildren(SlotVisitor& visitor) 40 40 { 41 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 42 COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); 43 ASSERT(structure()->typeInfo().overridesVisitChildren()); 41 44 Base::visitChildren(visitor); 42 45 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r86482 r86499 908 908 push(@headerContent, "ALWAYS_INLINE bool ${className}::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot)\n"); 909 909 push(@headerContent, "{\n"); 910 push(@headerContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 910 911 push(@headerContent, GenerateGetOwnPropertySlotBody($dataNode, $interfaceName, $className, $implClassName, $numAttributes > 0, 1)); 911 912 push(@headerContent, "}\n\n"); 912 913 push(@headerContent, "ALWAYS_INLINE bool ${className}::getOwnPropertyDescriptor(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertyDescriptor& descriptor)\n"); 913 914 push(@headerContent, "{\n"); 915 push(@headerContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 914 916 push(@headerContent, GenerateGetOwnPropertyDescriptorBody($dataNode, $interfaceName, $className, $implClassName, $numAttributes > 0, 1)); 915 917 push(@headerContent, "}\n\n"); … … 1453 1455 push(@implContent, "void ${className}::visitChildren(SlotVisitor& visitor)\n"); 1454 1456 push(@implContent, "{\n"); 1457 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1458 push(@implContent, " COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);\n"); 1459 push(@implContent, " ASSERT(structure()->typeInfo().overridesVisitChildren());\n"); 1455 1460 push(@implContent, " Base::visitChildren(visitor);\n"); 1456 1461 push(@implContent, " impl()->visitJSEventListeners(visitor);\n"); … … 1485 1490 push(@implContent, "bool ${className}::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)\n"); 1486 1491 push(@implContent, "{\n"); 1492 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1487 1493 push(@implContent, GenerateGetOwnPropertySlotBody($dataNode, $interfaceName, $className, $implClassName, $numAttributes > 0, 0)); 1488 1494 push(@implContent, "}\n\n"); 1489 1495 push(@implContent, "bool ${className}::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)\n"); 1490 1496 push(@implContent, "{\n"); 1497 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1491 1498 push(@implContent, GenerateGetOwnPropertyDescriptorBody($dataNode, $interfaceName, $className, $implClassName, $numAttributes > 0, 0)); 1492 1499 push(@implContent, "}\n\n"); … … 1497 1504 push(@implContent, "bool ${className}::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)\n"); 1498 1505 push(@implContent, "{\n"); 1506 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1499 1507 push(@implContent, " if (propertyName < static_cast<$implClassName*>(impl())->length()) {\n"); 1500 1508 if ($dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"}) { … … 1648 1656 push(@implContent, "void ${className}::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)\n"); 1649 1657 push(@implContent, "{\n"); 1658 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1650 1659 if ($dataNode->extendedAttributes->{"HasCustomIndexSetter"}) { 1651 1660 push(@implContent, " bool ok;\n"); … … 1672 1681 push(@implContent, "void ${className}::put(ExecState* exec, unsigned propertyName, JSValue value)\n"); 1673 1682 push(@implContent, "{\n"); 1683 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1674 1684 push(@implContent, " indexSetter(exec, propertyName, value);\n"); 1675 1685 push(@implContent, " return;\n"); … … 1826 1836 push(@implContent, "void ${className}::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)\n"); 1827 1837 push(@implContent, "{\n"); 1838 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 1828 1839 if ($dataNode->extendedAttributes->{"HasIndexGetter"} || $dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"}) { 1829 1840 push(@implContent, " for (unsigned i = 0; i < static_cast<${implClassName}*>(impl())->length(); ++i)\n"); … … 1876 1887 push(@implContent, " $className* castedThis = static_cast<$className*>(asObject(thisValue));\n"); 1877 1888 } 1889 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(castedThis, &${className}::s_info);\n"); 1878 1890 1879 1891 if ($dataNode->extendedAttributes->{"CheckDomainSecurity"} && … … 2107 2119 push(@implContent, "{\n"); 2108 2120 push(@implContent, " ${className}* thisObj = static_cast<$className*>(asObject(slotBase));\n"); 2121 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(thisObj, &s_info);\n"); 2109 2122 if (IndexGetterReturnsStrings($implClassName)) { 2110 2123 $implIncludes{"KURL.h"} = 1; … … 2123 2136 push(@implContent, "\nJSValue ${className}::getByIndex(ExecState*, unsigned index)\n"); 2124 2137 push(@implContent, "{\n"); 2138 push(@implContent, " ASSERT_GC_OBJECT_INHERITS(this, &s_info);\n"); 2125 2139 push(@implContent, " return jsNumber(static_cast<$implClassName*>(impl())->item(index));\n"); 2126 2140 push(@implContent, "}\n\n"); -
trunk/Source/WebKit2/ChangeLog
r86497 r86499 1 2011-05-13 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Geoffrey Garen. 4 5 Make GC validation more aggressive 6 https://bugs.webkit.org/show_bug.cgi?id=60802 7 8 Add GC_VALIDATION calls to all the JSNPObject methods. 9 10 * WebProcess/Plugins/Netscape/JSNPObject.cpp: 11 (WebKit::JSNPObject::invalidate): 12 (WebKit::JSNPObject::callMethod): 13 (WebKit::JSNPObject::callObject): 14 (WebKit::JSNPObject::callConstructor): 15 (WebKit::JSNPObject::getCallData): 16 (WebKit::JSNPObject::getConstructData): 17 (WebKit::JSNPObject::getOwnPropertySlot): 18 (WebKit::JSNPObject::getOwnPropertyDescriptor): 19 (WebKit::JSNPObject::put): 20 (WebKit::JSNPObject::getOwnPropertyNames): 21 (WebKit::JSNPObject::propertyGetter): 22 (WebKit::JSNPObject::methodGetter): 23 24 2011-05-13 Oliver Hunt <oliver@apple.com> 25 26 Reviewed by Geoffrey Garen. 27 28 Make GC validation more aggressive 29 https://bugs.webkit.org/show_bug.cgi?id=60802 30 31 Add GC_VALIDATION calls to all the JSNPObject methods. 32 33 * WebProcess/Plugins/Netscape/JSNPObject.cpp: 34 (WebKit::JSNPObject::invalidate): 35 (WebKit::JSNPObject::callMethod): 36 (WebKit::JSNPObject::callObject): 37 (WebKit::JSNPObject::callConstructor): 38 (WebKit::JSNPObject::getCallData): 39 (WebKit::JSNPObject::getConstructData): 40 (WebKit::JSNPObject::getOwnPropertySlot): 41 (WebKit::JSNPObject::getOwnPropertyDescriptor): 42 (WebKit::JSNPObject::put): 43 (WebKit::JSNPObject::getOwnPropertyNames): 44 (WebKit::JSNPObject::propertyGetter): 45 (WebKit::JSNPObject::methodGetter): 46 1 47 2011-05-14 Alexey Proskuryakov <ap@apple.com> 2 48 -
trunk/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.cpp
r86482 r86499 73 73 { 74 74 ASSERT(m_npObject); 75 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 75 76 76 77 releaseNPObject(m_npObject); … … 80 81 JSValue JSNPObject::callMethod(ExecState* exec, NPIdentifier methodName) 81 82 { 83 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 82 84 if (!m_npObject) 83 85 return throwInvalidAccessError(exec); … … 119 121 JSC::JSValue JSNPObject::callObject(JSC::ExecState* exec) 120 122 { 123 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 121 124 if (!m_npObject) 122 125 return throwInvalidAccessError(exec); … … 158 161 JSValue JSNPObject::callConstructor(ExecState* exec) 159 162 { 163 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 160 164 if (!m_npObject) 161 165 return throwInvalidAccessError(exec); … … 201 205 JSC::CallType JSNPObject::getCallData(JSC::CallData& callData) 202 206 { 207 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 203 208 if (!m_npObject || !m_npObject->_class->invokeDefault) 204 209 return CallTypeNone; … … 218 223 ConstructType JSNPObject::getConstructData(ConstructData& constructData) 219 224 { 225 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 220 226 if (!m_npObject || !m_npObject->_class->construct) 221 227 return ConstructTypeNone; … … 227 233 bool JSNPObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 228 234 { 235 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 229 236 if (!m_npObject) { 230 237 throwInvalidAccessError(exec); … … 251 258 bool JSNPObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) 252 259 { 260 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 253 261 if (!m_npObject) { 254 262 throwInvalidAccessError(exec); … … 279 287 void JSNPObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot&) 280 288 { 289 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 281 290 if (!m_npObject) { 282 291 throwInvalidAccessError(exec); … … 316 325 void JSNPObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNameArray, EnumerationMode mode) 317 326 { 327 ASSERT_GC_OBJECT_INHERITS(this, &s_info); 318 328 if (!m_npObject) { 319 329 throwInvalidAccessError(exec); … … 363 373 { 364 374 JSNPObject* thisObj = static_cast<JSNPObject*>(asObject(slotBase)); 365 375 ASSERT_GC_OBJECT_INHERITS(thisObj, &s_info); 376 366 377 if (!thisObj->m_npObject) 367 378 return throwInvalidAccessError(exec); … … 398 409 { 399 410 JSNPObject* thisObj = static_cast<JSNPObject*>(asObject(slotBase)); 411 ASSERT_GC_OBJECT_INHERITS(thisObj, &s_info); 400 412 401 413 if (!thisObj->m_npObject)
Note: See TracChangeset
for help on using the changeset viewer.