void StackIterator::gotoNextFrame() { #if ENABLE(DFG_JIT) if (m_frame.isInlinedFrame()) { InlineCallFrame* inlineCallFrame = m_frame.inlineCallFrame(); CodeOrigin* callerCodeOrigin = &inlineCallFrame->caller; readInlinedFrame(m_frame.callFrame(), callerCodeOrigin); } else #endif // ENABLE(DFG_JIT) readFrame(m_frame.callerFrame()); }
void StackVisitor::gotoNextFrame() { #if ENABLE(DFG_JIT) if (m_frame.isInlinedFrame()) { InlineCallFrame* inlineCallFrame = m_frame.inlineCallFrame(); CodeOrigin* callerCodeOrigin = inlineCallFrame->getCallerSkippingDeadFrames(); if (!callerCodeOrigin) { while (inlineCallFrame) { readInlinedFrame(m_frame.callFrame(), &inlineCallFrame->directCaller); inlineCallFrame = m_frame.inlineCallFrame(); } m_frame.m_VMEntryFrame = m_frame.m_CallerVMEntryFrame; readFrame(m_frame.callerFrame()); } else readInlinedFrame(m_frame.callFrame(), callerCodeOrigin); return; } #endif // ENABLE(DFG_JIT) m_frame.m_VMEntryFrame = m_frame.m_CallerVMEntryFrame; readFrame(m_frame.callerFrame()); }
void StackVisitor::gotoNextFrame() { #if ENABLE(DFG_JIT) if (m_frame.isInlinedFrame()) { InlineCallFrame* inlineCallFrame = m_frame.inlineCallFrame(); CodeOrigin* callerCodeOrigin = &inlineCallFrame->caller; readInlinedFrame(m_frame.callFrame(), callerCodeOrigin); return; } #endif // ENABLE(DFG_JIT) m_frame.m_VMEntryFrame = m_frame.m_CallerVMEntryFrame; readFrame(m_frame.callerFrame()); }
void StackVisitor::readFrame(CallFrame* callFrame) { if (!callFrame) { m_frame.setToEnd(); return; } if (callFrame->isAnyWasmCallee()) { readNonInlinedFrame(callFrame); return; } #if !ENABLE(DFG_JIT) readNonInlinedFrame(callFrame); #else // !ENABLE(DFG_JIT) // If the frame doesn't have a code block, then it's not a DFG frame. // Hence, we're not at an inlined frame. CodeBlock* codeBlock = callFrame->codeBlock(); if (!codeBlock) { readNonInlinedFrame(callFrame); return; } // If the code block does not have any code origins, then there's no // inlining. Hence, we're not at an inlined frame. if (!codeBlock->hasCodeOrigins()) { readNonInlinedFrame(callFrame); return; } CallSiteIndex index = callFrame->callSiteIndex(); ASSERT(codeBlock->canGetCodeOrigin(index)); if (!codeBlock->canGetCodeOrigin(index)) { // See assertion above. In release builds, we try to protect ourselves // from crashing even though stack walking will be goofed up. m_frame.setToEnd(); return; } CodeOrigin codeOrigin = codeBlock->codeOrigin(index); if (!codeOrigin.inlineCallFrame) { readNonInlinedFrame(callFrame, &codeOrigin); return; } readInlinedFrame(callFrame, &codeOrigin); #endif // !ENABLE(DFG_JIT) }