| Index: src/inspector/v8-debugger.cc
|
| diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc
|
| index 51346ed787e6ae509ae42fb11689077a8e0b867a..966a59b126de6e7a6ca7f3062c4a6fad68993d38 100644
|
| --- a/src/inspector/v8-debugger.cc
|
| +++ b/src/inspector/v8-debugger.cc
|
| @@ -68,12 +68,7 @@ void V8Debugger::enable() {
|
| if (m_enableCount++) return;
|
| DCHECK(!enabled());
|
| v8::HandleScope scope(m_isolate);
|
| - v8::debug::SetDebugEventListener(m_isolate, &V8Debugger::v8DebugEventCallback,
|
| - v8::External::New(m_isolate, this));
|
| - v8::debug::SetAsyncTaskListener(m_isolate, &V8Debugger::v8AsyncTaskListener,
|
| - this);
|
| - v8::debug::SetCompileEventListener(m_isolate,
|
| - &V8Debugger::v8CompileEventListener, this);
|
| + v8::debug::SetDebugEventListener(m_isolate, this);
|
| m_debuggerContext.Reset(m_isolate, v8::debug::GetDebugContext(m_isolate));
|
| v8::debug::ChangeBreakOnException(m_isolate, v8::debug::NoBreakOnException);
|
| m_pauseOnExceptionsState = v8::debug::NoBreakOnException;
|
| @@ -89,8 +84,6 @@ void V8Debugger::disable() {
|
| allAsyncTasksCanceled();
|
| m_wasmTranslation.Clear();
|
| v8::debug::SetDebugEventListener(m_isolate, nullptr);
|
| - v8::debug::SetAsyncTaskListener(m_isolate, nullptr, nullptr);
|
| - v8::debug::SetCompileEventListener(m_isolate, nullptr, nullptr);
|
| }
|
|
|
| bool V8Debugger::enabled() const { return !m_debuggerScript.IsEmpty(); }
|
| @@ -512,117 +505,75 @@ void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext,
|
| }
|
| }
|
|
|
| -void V8Debugger::v8DebugEventCallback(
|
| - const v8::debug::EventDetails& eventDetails) {
|
| - V8Debugger* thisPtr = toV8Debugger(eventDetails.GetCallbackData());
|
| - thisPtr->handleV8DebugEvent(eventDetails);
|
| -}
|
| -
|
| -v8::Local<v8::Value> V8Debugger::callInternalGetterFunction(
|
| - v8::Local<v8::Object> object, const char* functionName) {
|
| - v8::MicrotasksScope microtasks(m_isolate,
|
| - v8::MicrotasksScope::kDoNotRunMicrotasks);
|
| - v8::Local<v8::Value> getterValue =
|
| - object
|
| - ->Get(m_isolate->GetCurrentContext(),
|
| - toV8StringInternalized(m_isolate, functionName))
|
| - .ToLocalChecked();
|
| - DCHECK(!getterValue.IsEmpty() && getterValue->IsFunction());
|
| - return v8::Local<v8::Function>::Cast(getterValue)
|
| - ->Call(m_isolate->GetCurrentContext(), object, 0, nullptr)
|
| - .ToLocalChecked();
|
| -}
|
| -
|
| -void V8Debugger::handleV8DebugEvent(
|
| - const v8::debug::EventDetails& eventDetails) {
|
| - if (!enabled()) return;
|
| - v8::HandleScope scope(m_isolate);
|
| -
|
| - v8::DebugEvent event = eventDetails.GetEvent();
|
| - if (event != v8::Break && event != v8::Exception) return;
|
| -
|
| - v8::Local<v8::Context> eventContext = eventDetails.GetEventContext();
|
| - DCHECK(!eventContext.IsEmpty());
|
| - V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup(
|
| - m_inspector->contextGroupId(eventContext));
|
| - if (!agent) return;
|
| -
|
| - if (event == v8::Exception) {
|
| - v8::Local<v8::Context> context = debuggerContext();
|
| - v8::Local<v8::Object> eventData = eventDetails.GetEventData();
|
| - v8::Local<v8::Value> exception =
|
| - callInternalGetterFunction(eventData, "exception");
|
| - v8::Local<v8::Value> promise =
|
| - callInternalGetterFunction(eventData, "promise");
|
| - bool isPromiseRejection = !promise.IsEmpty() && promise->IsObject();
|
| - v8::Local<v8::Value> uncaught =
|
| - callInternalGetterFunction(eventData, "uncaught");
|
| - bool isUncaught = uncaught->BooleanValue(context).FromJust();
|
| - handleProgramBreak(eventContext, eventDetails.GetExecutionState(),
|
| - exception, v8::Local<v8::Array>(), isPromiseRejection,
|
| - isUncaught);
|
| - } else if (event == v8::Break) {
|
| - v8::Local<v8::Value> argv[] = {eventDetails.GetEventData()};
|
| - v8::Local<v8::Value> hitBreakpoints;
|
| - if (!callDebuggerMethod("getBreakpointNumbers", 1, argv)
|
| - .ToLocal(&hitBreakpoints))
|
| - return;
|
| - DCHECK(hitBreakpoints->IsArray());
|
| - handleProgramBreak(eventContext, eventDetails.GetExecutionState(),
|
| - v8::Local<v8::Value>(), hitBreakpoints.As<v8::Array>());
|
| - }
|
| -}
|
| -
|
| -void V8Debugger::v8CompileEventListener(v8::Local<v8::debug::Script> script,
|
| - bool has_compile_error, void* data) {
|
| - V8Debugger* debugger = static_cast<V8Debugger*>(data);
|
| +void V8Debugger::OnCompileEvent(v8::Local<v8::debug::Script> script,
|
| + bool has_compile_error) {
|
| v8::Local<v8::Value> contextData;
|
| if (!script->ContextData().ToLocal(&contextData) || !contextData->IsInt32()) {
|
| return;
|
| }
|
| int contextId = static_cast<int>(contextData.As<v8::Int32>()->Value());
|
| V8DebuggerAgentImpl* agent =
|
| - debugger->m_inspector->enabledDebuggerAgentForGroup(contextId);
|
| + m_inspector->enabledDebuggerAgentForGroup(contextId);
|
| if (!agent) return;
|
| if (script->IsWasm()) {
|
| - debugger->m_wasmTranslation.AddScript(script.As<v8::debug::WasmScript>(),
|
| - agent);
|
| - } else if (debugger->m_ignoreScriptParsedEventsCounter == 0) {
|
| + m_wasmTranslation.AddScript(script.As<v8::debug::WasmScript>(), agent);
|
| + } else if (m_ignoreScriptParsedEventsCounter == 0) {
|
| agent->didParseSource(
|
| - V8DebuggerScript::Create(debugger->m_isolate, script, inLiveEditScope),
|
| + V8DebuggerScript::Create(m_isolate, script, inLiveEditScope),
|
| !has_compile_error);
|
| }
|
| }
|
|
|
| -void V8Debugger::v8AsyncTaskListener(v8::debug::PromiseDebugActionType type,
|
| - int id, void* data) {
|
| - V8Debugger* debugger = static_cast<V8Debugger*>(data);
|
| - if (!debugger->m_maxAsyncCallStackDepth) return;
|
| +void V8Debugger::OnBreakEvent(v8::Local<v8::Context> pausedContext,
|
| + v8::Local<v8::Object> execState,
|
| + v8::Local<v8::Value> breakPointsHit) {
|
| + v8::Local<v8::Value> argv[] = {breakPointsHit};
|
| + v8::Local<v8::Value> hitBreakpoints;
|
| + if (!callDebuggerMethod("getBreakpointNumbers", 1, argv)
|
| + .ToLocal(&hitBreakpoints)) {
|
| + return;
|
| + }
|
| + DCHECK(hitBreakpoints->IsArray());
|
| + handleProgramBreak(pausedContext, execState, v8::Local<v8::Value>(),
|
| + hitBreakpoints.As<v8::Array>());
|
| +}
|
| +
|
| +void V8Debugger::OnExceptionEvent(v8::Local<v8::Context> pausedContext,
|
| + v8::Local<v8::Object> execState,
|
| + v8::Local<v8::Value> exception,
|
| + bool isPromiseRejection, bool isUncaught) {
|
| + handleProgramBreak(pausedContext, execState, exception,
|
| + v8::Local<v8::Array>(), isPromiseRejection, isUncaught);
|
| +}
|
| +
|
| +void V8Debugger::OnAsyncTaskEvent(v8::debug::PromiseDebugActionType type,
|
| + int id) {
|
| + if (!m_maxAsyncCallStackDepth) return;
|
| // Async task events from Promises are given misaligned pointers to prevent
|
| // from overlapping with other Blink task identifiers. There is a single
|
| // namespace of such ids, managed by src/js/promise.js.
|
| void* ptr = reinterpret_cast<void*>(id * 2 + 1);
|
| switch (type) {
|
| case v8::debug::kDebugEnqueueAsyncFunction:
|
| - debugger->asyncTaskScheduled("async function", ptr, true);
|
| + asyncTaskScheduled("async function", ptr, true);
|
| break;
|
| case v8::debug::kDebugEnqueuePromiseResolve:
|
| - debugger->asyncTaskScheduled("Promise.resolve", ptr, true);
|
| + asyncTaskScheduled("Promise.resolve", ptr, true);
|
| break;
|
| case v8::debug::kDebugEnqueuePromiseReject:
|
| - debugger->asyncTaskScheduled("Promise.reject", ptr, true);
|
| + asyncTaskScheduled("Promise.reject", ptr, true);
|
| break;
|
| case v8::debug::kDebugEnqueuePromiseResolveThenableJob:
|
| - debugger->asyncTaskScheduled("PromiseResolveThenableJob", ptr, true);
|
| + asyncTaskScheduled("PromiseResolveThenableJob", ptr, true);
|
| break;
|
| case v8::debug::kDebugPromiseCollected:
|
| - debugger->asyncTaskCanceled(ptr);
|
| + asyncTaskCanceled(ptr);
|
| break;
|
| case v8::debug::kDebugWillHandle:
|
| - debugger->asyncTaskStarted(ptr);
|
| + asyncTaskStarted(ptr);
|
| break;
|
| case v8::debug::kDebugDidHandle:
|
| - debugger->asyncTaskFinished(ptr);
|
| + asyncTaskFinished(ptr);
|
| break;
|
| }
|
| }
|
|
|