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/protocol/Protocol.h" | 8 #include "src/inspector/protocol/Protocol.h" |
9 #include "src/inspector/script-breakpoint.h" | 9 #include "src/inspector/script-breakpoint.h" |
10 #include "src/inspector/string-util.h" | 10 #include "src/inspector/string-util.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 const char* functionName, int argc, v8::Local<v8::Value> argv[]) { | 37 const char* functionName, int argc, v8::Local<v8::Value> argv[]) { |
38 v8::MicrotasksScope microtasks(m_isolate, | 38 v8::MicrotasksScope microtasks(m_isolate, |
39 v8::MicrotasksScope::kDoNotRunMicrotasks); | 39 v8::MicrotasksScope::kDoNotRunMicrotasks); |
40 DCHECK(m_isolate->InContext()); | 40 DCHECK(m_isolate->InContext()); |
41 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); | 41 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); |
42 v8::Local<v8::Object> debuggerScript = m_debuggerScript.Get(m_isolate); | 42 v8::Local<v8::Object> debuggerScript = m_debuggerScript.Get(m_isolate); |
43 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( | 43 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
44 debuggerScript | 44 debuggerScript |
45 ->Get(context, toV8StringInternalized(m_isolate, functionName)) | 45 ->Get(context, toV8StringInternalized(m_isolate, functionName)) |
46 .ToLocalChecked()); | 46 .ToLocalChecked()); |
| 47 v8::TryCatch try_catch; |
47 return function->Call(context, debuggerScript, argc, argv); | 48 return function->Call(context, debuggerScript, argc, argv); |
48 } | 49 } |
49 | 50 |
50 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) | 51 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) |
51 : m_isolate(isolate), | 52 : m_isolate(isolate), |
52 m_inspector(inspector), | 53 m_inspector(inspector), |
53 m_lastContextId(0), | 54 m_lastContextId(0), |
54 m_enableCount(0), | 55 m_enableCount(0), |
55 m_breakpointsActivated(true), | 56 m_breakpointsActivated(true), |
56 m_runningNestedMessageLoop(false), | 57 m_runningNestedMessageLoop(false), |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 JavaScriptCallFrames V8Debugger::currentCallFrames(int limit) { | 431 JavaScriptCallFrames V8Debugger::currentCallFrames(int limit) { |
431 if (!m_isolate->InContext()) return JavaScriptCallFrames(); | 432 if (!m_isolate->InContext()) return JavaScriptCallFrames(); |
432 v8::Local<v8::Value> currentCallFramesV8; | 433 v8::Local<v8::Value> currentCallFramesV8; |
433 if (m_executionState.IsEmpty()) { | 434 if (m_executionState.IsEmpty()) { |
434 v8::Local<v8::Function> currentCallFramesFunction = | 435 v8::Local<v8::Function> currentCallFramesFunction = |
435 v8::Local<v8::Function>::Cast( | 436 v8::Local<v8::Function>::Cast( |
436 m_debuggerScript.Get(m_isolate) | 437 m_debuggerScript.Get(m_isolate) |
437 ->Get(debuggerContext(), | 438 ->Get(debuggerContext(), |
438 toV8StringInternalized(m_isolate, "currentCallFrames")) | 439 toV8StringInternalized(m_isolate, "currentCallFrames")) |
439 .ToLocalChecked()); | 440 .ToLocalChecked()); |
440 currentCallFramesV8 = | 441 if (!v8::DebugInterface::Call(debuggerContext(), currentCallFramesFunction, |
441 v8::DebugInterface::Call(debuggerContext(), currentCallFramesFunction, | 442 v8::Integer::New(m_isolate, limit)) |
442 v8::Integer::New(m_isolate, limit)) | 443 .ToLocal(¤tCallFramesV8)) |
443 .ToLocalChecked(); | 444 return JavaScriptCallFrames(); |
444 } else { | 445 } else { |
445 v8::Local<v8::Value> argv[] = {m_executionState, | 446 v8::Local<v8::Value> argv[] = {m_executionState, |
446 v8::Integer::New(m_isolate, limit)}; | 447 v8::Integer::New(m_isolate, limit)}; |
447 currentCallFramesV8 = | 448 if (!callDebuggerMethod("currentCallFrames", arraysize(argv), argv) |
448 callDebuggerMethod("currentCallFrames", arraysize(argv), argv) | 449 .ToLocal(¤tCallFramesV8)) |
449 .ToLocalChecked(); | 450 return JavaScriptCallFrames(); |
450 } | 451 } |
451 DCHECK(!currentCallFramesV8.IsEmpty()); | 452 DCHECK(!currentCallFramesV8.IsEmpty()); |
452 if (!currentCallFramesV8->IsArray()) return JavaScriptCallFrames(); | 453 if (!currentCallFramesV8->IsArray()) return JavaScriptCallFrames(); |
453 v8::Local<v8::Array> callFramesArray = currentCallFramesV8.As<v8::Array>(); | 454 v8::Local<v8::Array> callFramesArray = currentCallFramesV8.As<v8::Array>(); |
454 JavaScriptCallFrames callFrames; | 455 JavaScriptCallFrames callFrames; |
455 for (uint32_t i = 0; i < callFramesArray->Length(); ++i) { | 456 for (uint32_t i = 0; i < callFramesArray->Length(); ++i) { |
456 v8::Local<v8::Value> callFrameValue; | 457 v8::Local<v8::Value> callFrameValue; |
457 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) | 458 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) |
458 return JavaScriptCallFrames(); | 459 return JavaScriptCallFrames(); |
459 if (!callFrameValue->IsObject()) return JavaScriptCallFrames(); | 460 if (!callFrameValue->IsObject()) return JavaScriptCallFrames(); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 callInternalGetterFunction(eventData, "promise"); | 611 callInternalGetterFunction(eventData, "promise"); |
611 bool isPromiseRejection = !promise.IsEmpty() && promise->IsObject(); | 612 bool isPromiseRejection = !promise.IsEmpty() && promise->IsObject(); |
612 v8::Local<v8::Value> uncaught = | 613 v8::Local<v8::Value> uncaught = |
613 callInternalGetterFunction(eventData, "uncaught"); | 614 callInternalGetterFunction(eventData, "uncaught"); |
614 bool isUncaught = uncaught->BooleanValue(context).FromJust(); | 615 bool isUncaught = uncaught->BooleanValue(context).FromJust(); |
615 handleProgramBreak(eventContext, eventDetails.GetExecutionState(), | 616 handleProgramBreak(eventContext, eventDetails.GetExecutionState(), |
616 exception, v8::Local<v8::Array>(), isPromiseRejection, | 617 exception, v8::Local<v8::Array>(), isPromiseRejection, |
617 isUncaught); | 618 isUncaught); |
618 } else if (event == v8::Break) { | 619 } else if (event == v8::Break) { |
619 v8::Local<v8::Value> argv[] = {eventDetails.GetEventData()}; | 620 v8::Local<v8::Value> argv[] = {eventDetails.GetEventData()}; |
620 v8::Local<v8::Value> hitBreakpoints = | 621 v8::Local<v8::Value> hitBreakpoints; |
621 callDebuggerMethod("getBreakpointNumbers", 1, argv).ToLocalChecked(); | 622 if (!callDebuggerMethod("getBreakpointNumbers", 1, argv) |
| 623 .ToLocal(&hitBreakpoints)) |
| 624 return; |
622 DCHECK(hitBreakpoints->IsArray()); | 625 DCHECK(hitBreakpoints->IsArray()); |
623 handleProgramBreak(eventContext, eventDetails.GetExecutionState(), | 626 handleProgramBreak(eventContext, eventDetails.GetExecutionState(), |
624 v8::Local<v8::Value>(), hitBreakpoints.As<v8::Array>()); | 627 v8::Local<v8::Value>(), hitBreakpoints.As<v8::Array>()); |
625 } | 628 } |
626 } | 629 } |
627 | 630 |
628 void V8Debugger::handleV8AsyncTaskEvent(v8::Local<v8::Context> context, | 631 void V8Debugger::handleV8AsyncTaskEvent(v8::Local<v8::Context> context, |
629 v8::Local<v8::Object> executionState, | 632 v8::Local<v8::Object> executionState, |
630 v8::Local<v8::Object> eventData) { | 633 v8::Local<v8::Object> eventData) { |
631 if (!m_maxAsyncCallStackDepth) return; | 634 if (!m_maxAsyncCallStackDepth) return; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 return properties; | 775 return properties; |
773 } | 776 } |
774 | 777 |
775 v8::Local<v8::Value> V8Debugger::collectionEntries( | 778 v8::Local<v8::Value> V8Debugger::collectionEntries( |
776 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { | 779 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { |
777 if (!enabled()) { | 780 if (!enabled()) { |
778 UNREACHABLE(); | 781 UNREACHABLE(); |
779 return v8::Undefined(m_isolate); | 782 return v8::Undefined(m_isolate); |
780 } | 783 } |
781 v8::Local<v8::Value> argv[] = {object}; | 784 v8::Local<v8::Value> argv[] = {object}; |
782 v8::Local<v8::Value> entriesValue = | 785 v8::Local<v8::Value> entriesValue; |
783 callDebuggerMethod("getCollectionEntries", 1, argv).ToLocalChecked(); | 786 if (!callDebuggerMethod("getCollectionEntries", 1, argv) |
784 if (!entriesValue->IsArray()) return v8::Undefined(m_isolate); | 787 .ToLocal(&entriesValue) || |
| 788 !entriesValue->IsArray()) |
| 789 return v8::Undefined(m_isolate); |
785 | 790 |
786 v8::Local<v8::Array> entries = entriesValue.As<v8::Array>(); | 791 v8::Local<v8::Array> entries = entriesValue.As<v8::Array>(); |
787 v8::Local<v8::Array> copiedArray = | 792 v8::Local<v8::Array> copiedArray = |
788 v8::Array::New(m_isolate, entries->Length()); | 793 v8::Array::New(m_isolate, entries->Length()); |
789 if (!copiedArray->SetPrototype(context, v8::Null(m_isolate)).FromMaybe(false)) | 794 if (!copiedArray->SetPrototype(context, v8::Null(m_isolate)).FromMaybe(false)) |
790 return v8::Undefined(m_isolate); | 795 return v8::Undefined(m_isolate); |
791 for (uint32_t i = 0; i < entries->Length(); ++i) { | 796 for (uint32_t i = 0; i < entries->Length(); ++i) { |
792 v8::Local<v8::Value> item; | 797 v8::Local<v8::Value> item; |
793 if (!entries->Get(debuggerContext(), i).ToLocal(&item)) | 798 if (!entries->Get(debuggerContext(), i).ToLocal(&item)) |
794 return v8::Undefined(m_isolate); | 799 return v8::Undefined(m_isolate); |
(...skipping 12 matching lines...) Expand all Loading... |
807 return copiedArray; | 812 return copiedArray; |
808 } | 813 } |
809 | 814 |
810 v8::Local<v8::Value> V8Debugger::generatorObjectLocation( | 815 v8::Local<v8::Value> V8Debugger::generatorObjectLocation( |
811 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { | 816 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { |
812 if (!enabled()) { | 817 if (!enabled()) { |
813 UNREACHABLE(); | 818 UNREACHABLE(); |
814 return v8::Null(m_isolate); | 819 return v8::Null(m_isolate); |
815 } | 820 } |
816 v8::Local<v8::Value> argv[] = {object}; | 821 v8::Local<v8::Value> argv[] = {object}; |
817 v8::Local<v8::Value> location = | 822 v8::Local<v8::Value> location; |
818 callDebuggerMethod("getGeneratorObjectLocation", 1, argv) | |
819 .ToLocalChecked(); | |
820 v8::Local<v8::Value> copied; | 823 v8::Local<v8::Value> copied; |
821 if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, | 824 if (!callDebuggerMethod("getGeneratorObjectLocation", 1, argv) |
| 825 .ToLocal(&location) || |
| 826 !copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, |
822 location) | 827 location) |
823 .ToLocal(&copied) || | 828 .ToLocal(&copied) || |
824 !copied->IsObject()) | 829 !copied->IsObject()) |
825 return v8::Null(m_isolate); | 830 return v8::Null(m_isolate); |
826 if (!markAsInternal(context, v8::Local<v8::Object>::Cast(copied), | 831 if (!markAsInternal(context, v8::Local<v8::Object>::Cast(copied), |
827 V8InternalValueType::kLocation)) | 832 V8InternalValueType::kLocation)) |
828 return v8::Null(m_isolate); | 833 return v8::Null(m_isolate); |
829 return copied; | 834 return copied; |
830 } | 835 } |
831 | 836 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 | 988 |
984 size_t stackSize = | 989 size_t stackSize = |
985 fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; | 990 fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; |
986 if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) | 991 if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) |
987 stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; | 992 stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; |
988 | 993 |
989 return V8StackTraceImpl::capture(this, contextGroupId, stackSize); | 994 return V8StackTraceImpl::capture(this, contextGroupId, stackSize); |
990 } | 995 } |
991 | 996 |
992 } // namespace v8_inspector | 997 } // namespace v8_inspector |
OLD | NEW |