Changeset 154351 in webkit
- Timestamp:
- Aug 20, 2013 12:39:54 PM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r154346 r154351 1 2013-08-20 Mark Hahnenberg <mhahnenberg@apple.com> 2 3 <https://webkit.org/b/119919> Concurrent JIT crashes in various fast/js/dfg-* tests while the main thread is setting innerHTML 4 5 Reviewed by Geoffrey Garen. 6 7 More fixes for WriteBarrier deferral during concurrent JIT-ing. This patch makes the use of DesiredWriteBarriers class and the 8 initializeLazyWriteBarrierFor* wrapper functions more sane. 9 10 Refactored DesiredWriteBarrier to require an owner, a type, a CodeBlock, and an index. The type indicates how to use the CodeBlock 11 and index when triggering the WriteBarrier at the end of compilation. 12 13 The client code of initializeLazy* is now responsible for creating the WriteBarrier that will be initialized as well as passing 14 in the relevant index to be used at the end of compilation. Things were kind of muddled before in that one function did a 15 little extra work that really shouldn't have been its responsibility. 16 17 * dfg/DFGByteCodeParser.cpp: 18 (JSC::DFG::ByteCodeParser::addConstant): 19 (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): 20 * dfg/DFGDesiredWriteBarriers.cpp: 21 (JSC::DFG::DesiredWriteBarrier::DesiredWriteBarrier): 22 (JSC::DFG::DesiredWriteBarrier::trigger): 23 * dfg/DFGDesiredWriteBarriers.h: 24 (JSC::DFG::DesiredWriteBarriers::add): 25 (JSC::DFG::initializeLazyWriteBarrierForInlineCallFrameExecutable): 26 (JSC::DFG::initializeLazyWriteBarrierForInlineCallFrameCallee): 27 (JSC::DFG::initializeLazyWriteBarrierForConstant): 28 * dfg/DFGFixupPhase.cpp: 29 (JSC::DFG::FixupPhase::truncateConstantToInt32): 30 * dfg/DFGGraph.h: 31 (JSC::DFG::Graph::constantRegisterForConstant): 32 1 33 2013-08-20 Michael Saboff <msaboff@apple.com> 2 34 -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r154304 r154351 404 404 void addConstant(JSValue value) 405 405 { 406 unsigned constantIndex = m_codeBlock->addConstantLazily(); 406 407 initializeLazyWriteBarrierForConstant( 408 m_graph.m_plan.writeBarriers, 409 m_codeBlock->constants()[constantIndex], 407 410 m_codeBlock, 408 m_graph.m_plan.writeBarriers,411 constantIndex, 409 412 m_codeBlock->ownerExecutable(), 410 413 value); … … 3291 3294 3292 3295 InlineCallFrame inlineCallFrame; 3293 initializeLazyWriteBarrier( 3296 initializeLazyWriteBarrierForInlineCallFrameExecutable( 3297 byteCodeParser->m_graph.m_plan.writeBarriers, 3294 3298 inlineCallFrame.executable, 3295 byteCodeParser->m_graph.m_plan.writeBarriers, 3299 byteCodeParser->m_codeBlock, 3300 byteCodeParser->m_codeBlock->inlineCallFrames().size(), 3296 3301 byteCodeParser->m_codeBlock->ownerExecutable(), 3297 3302 codeBlock->ownerExecutable()); 3298 3303 inlineCallFrame.stackOffset = inlineCallFrameStart + JSStack::CallFrameHeaderSize; 3299 3304 if (callee) { 3300 initializeLazyWriteBarrier( 3305 initializeLazyWriteBarrierForInlineCallFrameCallee( 3306 byteCodeParser->m_graph.m_plan.writeBarriers, 3301 3307 inlineCallFrame.callee, 3302 byteCodeParser->m_graph.m_plan.writeBarriers, 3308 byteCodeParser->m_codeBlock, 3309 byteCodeParser->m_codeBlock->inlineCallFrames().size(), 3303 3310 byteCodeParser->m_codeBlock->ownerExecutable(), 3304 3311 callee); -
trunk/Source/JavaScriptCore/dfg/DFGDesiredWriteBarriers.cpp
r154287 r154351 35 35 namespace JSC { namespace DFG { 36 36 37 DesiredWriteBarrier::DesiredWriteBarrier( WriteBarrier<Unknown>* barrier, JSCell* owner)37 DesiredWriteBarrier::DesiredWriteBarrier(Type type, CodeBlock* codeBlock, unsigned index, JSCell* owner) 38 38 : m_owner(owner) 39 , m_type(NormalType) 39 , m_type(type) 40 , m_codeBlock(codeBlock) 41 , m_index(index) 40 42 { 41 u.m_barrier = barrier;42 }43 44 DesiredWriteBarrier::DesiredWriteBarrier(Vector<WriteBarrier<Unknown> >* barriers, unsigned index, JSCell* owner)45 : m_owner(owner)46 , m_type(VectorType)47 {48 u.barrier_vector.m_barriers = barriers;49 u.barrier_vector.m_index = index;50 43 } 51 44 … … 53 46 { 54 47 switch (m_type) { 55 case NormalType: { 56 u.m_barrier->set(vm, m_owner, u.m_barrier->get()); 48 case ConstantType: { 49 WriteBarrier<Unknown>& barrier = m_codeBlock->constants()[m_index]; 50 barrier.set(vm, m_owner, barrier.get()); 57 51 break; 58 52 } 59 53 60 case VectorType: { 61 unsigned index = u.barrier_vector.m_index; 62 WriteBarrier<Unknown>& barrier = u.barrier_vector.m_barriers->at(index); 63 barrier.set(vm, m_owner, barrier.get()); 54 case InlineCallFrameExecutableType: { 55 InlineCallFrame& inlineCallFrame = m_codeBlock->inlineCallFrames()[m_index]; 56 WriteBarrier<ScriptExecutable>& executable = inlineCallFrame.executable; 57 executable.set(vm, m_owner, executable.get()); 58 break; 59 } 60 61 case InlineCallFrameCalleeType: { 62 InlineCallFrame& inlineCallFrame = m_codeBlock->inlineCallFrames()[m_index]; 63 ASSERT(!!inlineCallFrame.callee); 64 WriteBarrier<JSFunction>& callee = inlineCallFrame.callee; 65 callee.set(vm, m_owner, callee.get()); 64 66 break; 65 67 } … … 76 78 } 77 79 78 DesiredWriteBarrier& DesiredWriteBarriers::addImpl(WriteBarrier<Unknown>* barrier, JSCell* owner)79 {80 m_barriers.append(DesiredWriteBarrier(barrier, owner));81 return m_barriers.last();82 }83 84 80 void DesiredWriteBarriers::trigger(VM& vm) 85 81 { … … 88 84 } 89 85 90 void initializeLazyWriteBarrierForConstant(CodeBlock* codeBlock, DesiredWriteBarriers& barriers, JSCell* owner, JSValue value)91 {92 unsigned constantIndex = codeBlock->addConstantLazily();93 WriteBarrier<Unknown>& barrier = codeBlock->constants()[constantIndex];94 barrier = WriteBarrier<Unknown>(95 barriers.add(codeBlock->constants(), constantIndex, owner), value);96 }97 98 86 } } // namespace JSC::DFG 99 87 -
trunk/Source/JavaScriptCore/dfg/DFGDesiredWriteBarriers.h
r154287 r154351 34 34 namespace JSC { 35 35 36 class JSFunction; 37 class ScriptExecutable; 36 38 class VM; 37 39 … … 40 42 class DesiredWriteBarrier { 41 43 public: 42 DesiredWriteBarrier(WriteBarrier<Unknown>*, JSCell* owner);43 DesiredWriteBarrier( Vector<WriteBarrier<Unknown> >*, unsigned index, JSCell* owner);44 enum Type { ConstantType, InlineCallFrameExecutableType, InlineCallFrameCalleeType }; 45 DesiredWriteBarrier(Type, CodeBlock*, unsigned index, JSCell* owner); 44 46 45 47 void trigger(VM&); … … 47 49 private: 48 50 JSCell* m_owner; 49 enum WriteBarrierType { NormalType, VectorType }; 50 WriteBarrierType m_type; 51 union { 52 WriteBarrier<Unknown>* m_barrier; 53 struct { 54 Vector<WriteBarrier<Unknown> >* m_barriers; 55 unsigned m_index; 56 } barrier_vector; 57 } u; 51 Type m_type; 52 CodeBlock* m_codeBlock; 53 unsigned m_index; 58 54 }; 59 55 … … 63 59 ~DesiredWriteBarriers(); 64 60 65 template <typename T> 66 DesiredWriteBarrier& add(WriteBarrier<T>& barrier, JSCell* owner) 61 DesiredWriteBarrier& add(DesiredWriteBarrier::Type type, CodeBlock* codeBlock, unsigned index, JSCell* owner) 67 62 { 68 return addImpl(reinterpret_cast<WriteBarrier<Unknown>*>(&barrier), owner); 69 } 70 71 DesiredWriteBarrier& add(Vector<WriteBarrier<Unknown> >& barriers, unsigned index, JSCell* owner) 72 { 73 m_barriers.append(DesiredWriteBarrier(&barriers, index, owner)); 63 m_barriers.append(DesiredWriteBarrier(type, codeBlock, index, owner)); 74 64 return m_barriers.last(); 75 65 } … … 78 68 79 69 private: 80 DesiredWriteBarrier& addImpl(WriteBarrier<Unknown>*, JSCell*);81 82 70 Vector<DesiredWriteBarrier> m_barriers; 83 71 }; 84 72 85 template <typename T, typename U> 86 void initializeLazyWriteBarrier(WriteBarrier<T>& barrier, DesiredWriteBarriers& barriers, JSCell* owner, U value) 73 inline void initializeLazyWriteBarrierForInlineCallFrameExecutable(DesiredWriteBarriers& barriers, WriteBarrier<ScriptExecutable>& barrier, CodeBlock* codeBlock, unsigned index, JSCell* owner, ScriptExecutable* value) 87 74 { 88 barrier = WriteBarrier<T>(barriers.add(barrier, owner), value); 75 DesiredWriteBarrier& desiredBarrier = barriers.add(DesiredWriteBarrier::InlineCallFrameExecutableType, codeBlock, index, owner); 76 barrier = WriteBarrier<ScriptExecutable>(desiredBarrier, value); 89 77 } 90 78 91 void initializeLazyWriteBarrierForConstant(CodeBlock*, DesiredWriteBarriers&, JSCell* owner, JSValue); 79 inline void initializeLazyWriteBarrierForInlineCallFrameCallee(DesiredWriteBarriers& barriers, WriteBarrier<JSFunction>& barrier, CodeBlock* codeBlock, unsigned index, JSCell* owner, JSFunction* value) 80 { 81 DesiredWriteBarrier& desiredBarrier = barriers.add(DesiredWriteBarrier::InlineCallFrameCalleeType, codeBlock, index, owner); 82 barrier = WriteBarrier<JSFunction>(desiredBarrier, value); 83 } 84 85 inline void initializeLazyWriteBarrierForConstant(DesiredWriteBarriers& barriers, WriteBarrier<Unknown>& barrier, CodeBlock* codeBlock, unsigned index, JSCell* owner, JSValue value) 86 { 87 DesiredWriteBarrier& desiredBarrier = barriers.add(DesiredWriteBarrier::ConstantType, codeBlock, index, owner); 88 barrier = WriteBarrier<Unknown>(desiredBarrier, value); 89 } 92 90 93 91 } } // namespace JSC::DFG -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r154305 r154351 1381 1381 unsigned constantRegister; 1382 1382 if (!codeBlock()->findConstant(value, constantRegister)) { 1383 constantRegister = codeBlock()->addConstantLazily(); 1383 1384 initializeLazyWriteBarrierForConstant( 1385 m_graph.m_plan.writeBarriers, 1386 codeBlock()->constants()[constantRegister], 1384 1387 codeBlock(), 1385 m_graph.m_plan.writeBarriers,1388 constantRegister, 1386 1389 codeBlock()->ownerExecutable(), 1387 1390 value); -
trunk/Source/JavaScriptCore/dfg/DFGGraph.h
r154245 r154351 156 156 unsigned constantRegister; 157 157 if (!m_codeBlock->findConstant(value, constantRegister)) { 158 constantRegister = m_codeBlock->addConstantLazily(); 158 159 initializeLazyWriteBarrierForConstant( 160 m_plan.writeBarriers, 161 m_codeBlock->constants()[constantRegister], 159 162 m_codeBlock, 160 m_plan.writeBarriers,163 constantRegister, 161 164 m_codeBlock->ownerExecutable(), 162 165 value);
Note: See TracChangeset
for help on using the changeset viewer.