Changeset 167467 in webkit
- Timestamp:
- Apr 17, 2014, 4:33:32 PM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r167456 r167467 1 2014-04-17 Filip Pizlo <fpizlo@apple.com> 2 3 InlineCallFrameSet should be refcounted 4 https://bugs.webkit.org/show_bug.cgi?id=131829 5 6 Reviewed by Geoffrey Garen. 7 8 And DFG::Plan should hold a ref to it. Previously it was owned by Graph until it 9 became owned by JITCode. Except that if we're "failing" to compile, JITCode may die. 10 Even as it dies, the GC may still want to scan the DFG::Plan, which leads to scanning 11 the DesiredWriteBarriers, which leads to scanning the InlineCallFrameSet. 12 13 So, just make the darn thing refcounted. 14 15 * bytecode/InlineCallFrameSet.h: 16 * dfg/DFGArgumentsSimplificationPhase.cpp: 17 (JSC::DFG::ArgumentsSimplificationPhase::run): 18 * dfg/DFGByteCodeParser.cpp: 19 (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): 20 * dfg/DFGCommonData.h: 21 * dfg/DFGGraph.cpp: 22 (JSC::DFG::Graph::Graph): 23 (JSC::DFG::Graph::requiredRegisterCountForExit): 24 * dfg/DFGGraph.h: 25 * dfg/DFGJITCompiler.cpp: 26 (JSC::DFG::JITCompiler::link): 27 * dfg/DFGPlan.cpp: 28 (JSC::DFG::Plan::Plan): 29 * dfg/DFGPlan.h: 30 * dfg/DFGStackLayoutPhase.cpp: 31 (JSC::DFG::StackLayoutPhase::run): 32 * ftl/FTLFail.cpp: 33 (JSC::FTL::fail): 34 * ftl/FTLLink.cpp: 35 (JSC::FTL::link): 36 1 37 2014-04-17 Filip Pizlo <fpizlo@apple.com> 2 38 -
trunk/Source/JavaScriptCore/bytecode/InlineCallFrameSet.h
r157576 r167467 29 29 #include "CodeOrigin.h" 30 30 #include <wtf/Bag.h> 31 #include <wtf/ Noncopyable.h>31 #include <wtf/RefCounted.h> 32 32 33 33 namespace JSC { 34 34 35 class InlineCallFrameSet { 36 WTF_MAKE_NONCOPYABLE(InlineCallFrameSet); 35 class InlineCallFrameSet : public RefCounted<InlineCallFrameSet> { 37 36 public: 38 37 InlineCallFrameSet(); -
trunk/Source/JavaScriptCore/dfg/DFGArgumentsSimplificationPhase.cpp
r166281 r167467 123 123 124 124 // Record which arguments are known to escape no matter what. 125 for (InlineCallFrameSet::iterator iter = m_graph.m_ inlineCallFrames->begin(); !!iter; ++iter)125 for (InlineCallFrameSet::iterator iter = m_graph.m_plan.inlineCallFrames->begin(); !!iter; ++iter) 126 126 pruneObviousArgumentCreations(*iter); 127 127 pruneObviousArgumentCreations(0); // the machine call frame. -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r167394 r167467 3401 3401 ASSERT(callsiteBlockHead); 3402 3402 3403 m_inlineCallFrame = byteCodeParser->m_graph.m_ inlineCallFrames->add();3403 m_inlineCallFrame = byteCodeParser->m_graph.m_plan.inlineCallFrames->add(); 3404 3404 initializeLazyWriteBarrierForInlineCallFrameExecutable( 3405 3405 byteCodeParser->m_graph.m_plan.writeBarriers, -
trunk/Source/JavaScriptCore/dfg/DFGCommonData.h
r166440 r167467 90 90 } 91 91 92 OwnPtr<InlineCallFrameSet> inlineCallFrames;92 RefPtr<InlineCallFrameSet> inlineCallFrames; 93 93 Vector<CodeOrigin, 0, UnsafeVectorOverflow> codeOrigins; 94 94 -
trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp
r167325 r167467 62 62 , m_allocator(longLivedState.m_allocator) 63 63 , m_mustHandleAbstractValues(OperandsLike, plan.mustHandleValues) 64 , m_inlineCallFrames(adoptPtr(new InlineCallFrameSet()))65 64 , m_hasArguments(false) 66 65 , m_nextMachineLocal(0) … … 762 761 { 763 762 unsigned count = JIT::frameRegisterCountFor(m_profiledBlock); 764 for (InlineCallFrameSet::iterator iter = m_ inlineCallFrames->begin(); !!iter; ++iter) {763 for (InlineCallFrameSet::iterator iter = m_plan.inlineCallFrames->begin(); !!iter; ++iter) { 765 764 InlineCallFrame* inlineCallFrame = *iter; 766 765 CodeBlock* codeBlock = baselineCodeBlockForInlineCallFrame(inlineCallFrame); -
trunk/Source/JavaScriptCore/dfg/DFGGraph.h
r167325 r167467 40 40 #include "DFGPlan.h" 41 41 #include "DFGScannable.h" 42 #include "InlineCallFrameSet.h"43 42 #include "JSStack.h" 44 43 #include "MethodOfGettingAValueProfile.h" … … 832 831 Bag<MultiPutByOffsetData> m_multiPutByOffsetData; 833 832 Vector<InlineVariableData, 4> m_inlineVariableData; 834 OwnPtr<InlineCallFrameSet> m_inlineCallFrames;835 833 HashMap<CodeBlock*, std::unique_ptr<FullBytecodeLiveness>> m_bytecodeLiveness; 836 834 bool m_hasArguments; -
trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp
r166440 r167467 154 154 m_jitCode->common.requiredRegisterCountForExit = m_graph.requiredRegisterCountForExit(); 155 155 156 if (!m_graph.m_ inlineCallFrames->isEmpty())157 m_jitCode->common.inlineCallFrames = m_graph.m_ inlineCallFrames.release();156 if (!m_graph.m_plan.inlineCallFrames->isEmpty()) 157 m_jitCode->common.inlineCallFrames = m_graph.m_plan.inlineCallFrames; 158 158 159 159 m_jitCode->common.machineCaptureStart = m_graph.m_machineCaptureStart; -
trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp
r166948 r167467 121 121 , mustHandleValues(mustHandleValues) 122 122 , compilation(codeBlock->vm()->m_perBytecodeProfiler ? adoptRef(new Profiler::Compilation(codeBlock->vm()->m_perBytecodeProfiler->ensureBytecodesFor(codeBlock.get()), profilerCompilationKindForMode(mode))) : 0) 123 , inlineCallFrames(adoptRef(new InlineCallFrameSet())) 123 124 , identifiers(codeBlock.get()) 124 125 , weakReferences(codeBlock.get()) -
trunk/Source/JavaScriptCore/dfg/DFGPlan.h
r164424 r167467 86 86 OwnPtr<Finalizer> finalizer; 87 87 88 RefPtr<InlineCallFrameSet> inlineCallFrames; 88 89 DesiredWatchpoints watchpoints; 89 90 DesiredIdentifiers identifiers; -
trunk/Source/JavaScriptCore/dfg/DFGStackLayoutPhase.cpp
r166064 r167467 104 104 if (codeBlock()->uncheckedActivationRegister().isValid()) 105 105 usedLocals.set(codeBlock()->activationRegister().toLocal()); 106 for (InlineCallFrameSet::iterator iter = m_graph.m_ inlineCallFrames->begin(); !!iter; ++iter) {106 for (InlineCallFrameSet::iterator iter = m_graph.m_plan.inlineCallFrames->begin(); !!iter; ++iter) { 107 107 InlineCallFrame* inlineCallFrame = *iter; 108 108 if (!inlineCallFrame->executable->usesArguments()) -
trunk/Source/JavaScriptCore/ftl/FTLFail.cpp
r167456 r167467 41 41 state.graph.m_plan.finalizer = adoptPtr(new FailedFinalizer(state.graph.m_plan)); 42 42 43 if (!state.graph.m_inlineCallFrames->isEmpty())44 state.jitCode->common.inlineCallFrames = std::move(state.graph.m_inlineCallFrames);45 46 43 if (state.module) 47 44 llvm->DisposeModule(state.module); -
trunk/Source/JavaScriptCore/ftl/FTLLink.cpp
r165205 r167467 61 61 state.jitCode->common.requiredRegisterCountForExit = graph.requiredRegisterCountForExit(); 62 62 63 if (!graph.m_ inlineCallFrames->isEmpty())64 state.jitCode->common.inlineCallFrames = std::move(graph.m_inlineCallFrames);63 if (!graph.m_plan.inlineCallFrames->isEmpty()) 64 state.jitCode->common.inlineCallFrames = graph.m_plan.inlineCallFrames; 65 65 66 66 // Create the entrypoint. Note that we use this entrypoint totally differently
Note:
See TracChangeset
for help on using the changeset viewer.