void Debugger::returnEvent(CallFrame* callFrame) { if (m_isPaused) return; { PauseReasonDeclaration reason(*this, PausedBeforeReturn); updateCallFrame(callFrame, AttemptPause); } // Detach may have been called during pauseIfNeeded. if (!m_currentCallFrame) return; VMEntryFrame* topVMEntryFrame = m_vm.topVMEntryFrame; CallFrame* callerFrame = m_currentCallFrame->callerFrame(topVMEntryFrame); // Returning from a call, there was at least one expression on the statement we are returning to. m_pastFirstExpressionInStatement = true; // Treat stepping over a return statement like a step-out. if (m_currentCallFrame == m_pauseOnCallFrame) { m_pauseOnCallFrame = callerFrame; m_pauseOnStepOut = true; } updateCallFrame(callerFrame, NoPause); }
void Debugger::didExecuteProgram(CallFrame* callFrame) { if (m_isPaused) return; PauseReasonDeclaration reason(*this, PausedAtEndOfProgram); updateCallFrame(callFrame, AttemptPause); // Detach may have been called during pauseIfNeeded. if (!m_currentCallFrame) return; VMEntryFrame* topVMEntryFrame = m_vm.topVMEntryFrame; CallFrame* callerFrame = m_currentCallFrame->callerFrame(topVMEntryFrame); // Returning from a program, could be eval(), there was at least one expression on the statement we are returning to. m_pastFirstExpressionInStatement = true; // Treat stepping over the end of a program like a step-out. if (m_currentCallFrame == m_pauseOnCallFrame) { m_pauseOnCallFrame = callerFrame; m_pauseAtNextOpportunity = true; } updateCallFrame(callerFrame, NoPause); // Do not continue stepping into an unknown future program. if (!m_currentCallFrame) clearNextPauseState(); }
void Debugger::updateCallFrameAndPauseIfNeeded(CallFrame* callFrame) { updateCallFrame(callFrame); pauseIfNeeded(callFrame); if (!isStepping()) m_currentCallFrame = 0; }
void Debugger::willExecuteProgram(CallFrame* callFrame) { if (m_isPaused) return; updateCallFrame(callFrame, NoPause); }
void Debugger::callEvent(CallFrame* callFrame) { if (m_isPaused) return; updateCallFrame(callFrame, NoPause); }
void ScriptDebugServer::updateCallFrameAndPauseIfNeeded(CallFrame* callFrame) { updateCallFrame(callFrame); pauseIfNeeded(callFrame); if (!needsOpDebugCallbacks()) m_currentCallFrame = 0; }
void Debugger::didReachBreakpoint(CallFrame* callFrame) { if (m_isPaused) return; PauseReasonDeclaration reason(*this, PausedForDebuggerStatement); m_pauseAtNextOpportunity = true; setSteppingMode(SteppingModeEnabled); updateCallFrame(callFrame, AttemptPause); }
void Debugger::unwindEvent(CallFrame* callFrame) { if (m_isPaused) return; updateCallFrame(callFrame, NoPause); if (!m_currentCallFrame) return; VMEntryFrame* topVMEntryFrame = m_vm.topVMEntryFrame; CallFrame* callerFrame = m_currentCallFrame->callerFrame(topVMEntryFrame); // Treat stepping over an exception location like a step-out. if (m_currentCallFrame == m_pauseOnCallFrame) m_pauseOnCallFrame = callerFrame; updateCallFrame(callerFrame, NoPause); }
void Debugger::atStatement(CallFrame* callFrame) { if (m_isPaused) return; m_pastFirstExpressionInStatement = false; PauseReasonDeclaration reason(*this, PausedAtStatement); updateCallFrame(callFrame, AttemptPause); }
void Debugger::willExecuteProgram(CallFrame* callFrame) { if (m_isPaused) return; PauseReasonDeclaration reason(*this, PausedAtStartOfProgram); // FIXME: This check for whether we're debugging a worker thread is a workaround // for https://bugs.webkit.org/show_bug.cgi?id=102637. Remove it when we rework // the debugger implementation to not require callbacks. if (!m_isInWorkerThread) updateCallFrameAndPauseIfNeeded(callFrame); else if (isStepping()) updateCallFrame(callFrame); }
void Debugger::atExpression(CallFrame* callFrame) { if (m_isPaused) return; // If this is the first call in a statement, then we would have paused at the statement. if (!m_pastFirstExpressionInStatement) { m_pastFirstExpressionInStatement = true; return; } // Only pause at the next expression with step-in and step-out, not step-over. bool shouldAttemptPause = m_pauseAtNextOpportunity || m_pauseOnStepOut; PauseReasonDeclaration reason(*this, PausedAtExpression); updateCallFrame(callFrame, shouldAttemptPause ? AttemptPause : NoPause); }
void Debugger::exception(CallFrame* callFrame, JSValue exception, bool hasCatchHandler) { if (m_isPaused) return; PauseReasonDeclaration reason(*this, PausedForException); if (m_pauseOnExceptionsState == PauseOnAllExceptions || (m_pauseOnExceptionsState == PauseOnUncaughtExceptions && !hasCatchHandler)) { m_pauseAtNextOpportunity = true; setSteppingMode(SteppingModeEnabled); } m_hasHandlerForExceptionCallback = true; m_currentException = exception; updateCallFrame(callFrame, AttemptPause); m_currentException = JSValue(); m_hasHandlerForExceptionCallback = false; }
void WorkerScriptDebugServer::willExecuteProgram(JSC::CallFrame* callFrame) { if (!m_paused) updateCallFrame(callFrame); }