OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/inspector/v8-debugger.h" | 5 #include "src/inspector/v8-debugger.h" |
6 | 6 |
7 #include "src/inspector/debugger-script.h" | 7 #include "src/inspector/debugger-script.h" |
8 #include "src/inspector/inspected-context.h" | 8 #include "src/inspector/inspected-context.h" |
9 #include "src/inspector/protocol/Protocol.h" | 9 #include "src/inspector/protocol/Protocol.h" |
10 #include "src/inspector/script-breakpoint.h" | 10 #include "src/inspector/script-breakpoint.h" |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 | 338 |
339 bool V8Debugger::canBreakProgram() { | 339 bool V8Debugger::canBreakProgram() { |
340 if (!m_breakpointsActivated) return false; | 340 if (!m_breakpointsActivated) return false; |
341 return !v8::debug::AllFramesOnStackAreBlackboxed(m_isolate); | 341 return !v8::debug::AllFramesOnStackAreBlackboxed(m_isolate); |
342 } | 342 } |
343 | 343 |
344 void V8Debugger::breakProgram() { | 344 void V8Debugger::breakProgram() { |
345 // Don't allow nested breaks. | 345 // Don't allow nested breaks. |
346 if (isPaused()) return; | 346 if (isPaused()) return; |
347 if (!canBreakProgram()) return; | 347 if (!canBreakProgram()) return; |
348 | 348 v8::debug::BreakRightNow(m_isolate); |
349 v8::HandleScope scope(m_isolate); | |
350 v8::Local<v8::Function> breakFunction; | |
351 if (!v8::Function::New(m_isolate->GetCurrentContext(), | |
352 &V8Debugger::breakProgramCallback, | |
353 v8::External::New(m_isolate, this), 0, | |
354 v8::ConstructorBehavior::kThrow) | |
355 .ToLocal(&breakFunction)) | |
356 return; | |
357 v8::debug::Call(debuggerContext(), breakFunction).ToLocalChecked(); | |
358 } | 349 } |
359 | 350 |
360 void V8Debugger::continueProgram() { | 351 void V8Debugger::continueProgram() { |
361 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); | 352 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); |
362 m_pausedContext.Clear(); | 353 m_pausedContext.Clear(); |
363 m_executionState.Clear(); | 354 m_executionState.Clear(); |
364 } | 355 } |
365 | 356 |
366 void V8Debugger::stepIntoStatement() { | 357 void V8Debugger::stepIntoStatement() { |
367 DCHECK(isPaused()); | 358 DCHECK(isPaused()); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) | 489 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) |
499 return JavaScriptCallFrames(); | 490 return JavaScriptCallFrames(); |
500 if (!callFrameValue->IsObject()) return JavaScriptCallFrames(); | 491 if (!callFrameValue->IsObject()) return JavaScriptCallFrames(); |
501 v8::Local<v8::Object> callFrameObject = callFrameValue.As<v8::Object>(); | 492 v8::Local<v8::Object> callFrameObject = callFrameValue.As<v8::Object>(); |
502 callFrames.push_back(JavaScriptCallFrame::create( | 493 callFrames.push_back(JavaScriptCallFrame::create( |
503 debuggerContext(), v8::Local<v8::Object>::Cast(callFrameObject))); | 494 debuggerContext(), v8::Local<v8::Object>::Cast(callFrameObject))); |
504 } | 495 } |
505 return callFrames; | 496 return callFrames; |
506 } | 497 } |
507 | 498 |
508 static V8Debugger* toV8Debugger(v8::Local<v8::Value> data) { | |
509 void* p = v8::Local<v8::External>::Cast(data)->Value(); | |
510 return static_cast<V8Debugger*>(p); | |
511 } | |
512 | |
513 void V8Debugger::breakProgramCallback( | |
514 const v8::FunctionCallbackInfo<v8::Value>& info) { | |
515 DCHECK_EQ(info.Length(), 2); | |
516 V8Debugger* thisPtr = toV8Debugger(info.Data()); | |
517 if (!thisPtr->enabled()) return; | |
518 v8::Local<v8::Context> pausedContext = | |
519 thisPtr->m_isolate->GetCurrentContext(); | |
520 v8::Local<v8::Value> exception; | |
521 v8::Local<v8::Array> hitBreakpoints; | |
522 thisPtr->handleProgramBreak(pausedContext, | |
523 v8::Local<v8::Object>::Cast(info[0]), exception, | |
524 hitBreakpoints); | |
525 } | |
526 | |
527 void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, | 499 void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, |
528 v8::Local<v8::Object> executionState, | 500 v8::Local<v8::Object> executionState, |
529 v8::Local<v8::Value> exception, | 501 v8::Local<v8::Value> exception, |
530 v8::Local<v8::Array> hitBreakpointNumbers, | 502 v8::Local<v8::Array> hitBreakpointNumbers, |
531 bool isPromiseRejection, bool isUncaught) { | 503 bool isPromiseRejection, bool isUncaught) { |
532 // Don't allow nested breaks. | 504 // Don't allow nested breaks. |
533 if (isPaused()) return; | 505 if (isPaused()) return; |
534 | 506 |
535 V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup( | 507 V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup( |
536 m_inspector->contextGroupId(pausedContext)); | 508 m_inspector->contextGroupId(pausedContext)); |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1000 | 972 |
1001 return V8StackTraceImpl::capture(this, contextGroupId, stackSize); | 973 return V8StackTraceImpl::capture(this, contextGroupId, stackSize); |
1002 } | 974 } |
1003 | 975 |
1004 int V8Debugger::currentContextGroupId() { | 976 int V8Debugger::currentContextGroupId() { |
1005 if (!m_isolate->InContext()) return 0; | 977 if (!m_isolate->InContext()) return 0; |
1006 return m_inspector->contextGroupId(m_isolate->GetCurrentContext()); | 978 return m_inspector->contextGroupId(m_isolate->GetCurrentContext()); |
1007 } | 979 } |
1008 | 980 |
1009 } // namespace v8_inspector | 981 } // namespace v8_inspector |
OLD | NEW |