Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/inspector/v8-debugger.cc

Issue 2651153004: Fix uncaught exception bug from liveEditScriptSource (Closed)
Patch Set: ac Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/inspector/v8-debugger.h ('k') | test/inspector/debugger/set-script-source-exception.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 29 matching lines...) Expand all
40 int contextGroupId = inspector->contextGroupId(contextId); 40 int contextGroupId = inspector->contextGroupId(contextId);
41 if (!contextGroupId) return nullptr; 41 if (!contextGroupId) return nullptr;
42 return inspector->enabledDebuggerAgentForGroup(contextGroupId); 42 return inspector->enabledDebuggerAgentForGroup(contextGroupId);
43 } 43 }
44 44
45 } // namespace 45 } // namespace
46 46
47 static bool inLiveEditScope = false; 47 static bool inLiveEditScope = false;
48 48
49 v8::MaybeLocal<v8::Value> V8Debugger::callDebuggerMethod( 49 v8::MaybeLocal<v8::Value> V8Debugger::callDebuggerMethod(
50 const char* functionName, int argc, v8::Local<v8::Value> argv[]) { 50 const char* functionName, int argc, v8::Local<v8::Value> argv[],
51 bool catchExceptions) {
51 v8::MicrotasksScope microtasks(m_isolate, 52 v8::MicrotasksScope microtasks(m_isolate,
52 v8::MicrotasksScope::kDoNotRunMicrotasks); 53 v8::MicrotasksScope::kDoNotRunMicrotasks);
53 DCHECK(m_isolate->InContext()); 54 DCHECK(m_isolate->InContext());
54 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); 55 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
55 v8::Local<v8::Object> debuggerScript = m_debuggerScript.Get(m_isolate); 56 v8::Local<v8::Object> debuggerScript = m_debuggerScript.Get(m_isolate);
56 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( 57 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(
57 debuggerScript 58 debuggerScript
58 ->Get(context, toV8StringInternalized(m_isolate, functionName)) 59 ->Get(context, toV8StringInternalized(m_isolate, functionName))
59 .ToLocalChecked()); 60 .ToLocalChecked());
60 v8::TryCatch try_catch(m_isolate); 61 if (catchExceptions) {
62 v8::TryCatch try_catch(m_isolate);
63 return function->Call(context, debuggerScript, argc, argv);
64 }
61 return function->Call(context, debuggerScript, argc, argv); 65 return function->Call(context, debuggerScript, argc, argv);
62 } 66 }
63 67
64 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) 68 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector)
65 : m_isolate(isolate), 69 : m_isolate(isolate),
66 m_inspector(inspector), 70 m_inspector(inspector),
67 m_enableCount(0), 71 m_enableCount(0),
68 m_breakpointsActivated(true), 72 m_breakpointsActivated(true),
69 m_runningNestedMessageLoop(false), 73 m_runningNestedMessageLoop(false),
70 m_ignoreScriptParsedEventsCounter(0), 74 m_ignoreScriptParsedEventsCounter(0),
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 342
339 v8::Local<v8::Value> argv[] = {toV8String(m_isolate, sourceID), newSource, 343 v8::Local<v8::Value> argv[] = {toV8String(m_isolate, sourceID), newSource,
340 v8Boolean(dryRun, m_isolate)}; 344 v8Boolean(dryRun, m_isolate)};
341 345
342 v8::Local<v8::Value> v8result; 346 v8::Local<v8::Value> v8result;
343 { 347 {
344 EnableLiveEditScope enableLiveEditScope(m_isolate); 348 EnableLiveEditScope enableLiveEditScope(m_isolate);
345 v8::TryCatch tryCatch(m_isolate); 349 v8::TryCatch tryCatch(m_isolate);
346 tryCatch.SetVerbose(false); 350 tryCatch.SetVerbose(false);
347 v8::MaybeLocal<v8::Value> maybeResult = 351 v8::MaybeLocal<v8::Value> maybeResult =
348 callDebuggerMethod("liveEditScriptSource", 3, argv); 352 callDebuggerMethod("liveEditScriptSource", 3, argv, false);
349 if (tryCatch.HasCaught()) { 353 if (tryCatch.HasCaught()) {
350 v8::Local<v8::Message> message = tryCatch.Message(); 354 v8::Local<v8::Message> message = tryCatch.Message();
351 if (!message.IsEmpty()) 355 if (!message.IsEmpty())
352 return Response::Error(toProtocolStringWithTypeCheck(message->Get())); 356 return Response::Error(toProtocolStringWithTypeCheck(message->Get()));
353 else 357 else
354 return Response::InternalError(); 358 return Response::InternalError();
355 } 359 }
356 v8result = maybeResult.ToLocalChecked(); 360 v8result = maybeResult.ToLocalChecked();
357 } 361 }
358 DCHECK(!v8result.IsEmpty()); 362 DCHECK(!v8result.IsEmpty());
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 ->Get(debuggerContext(), 419 ->Get(debuggerContext(),
416 toV8StringInternalized(m_isolate, "currentCallFrames")) 420 toV8StringInternalized(m_isolate, "currentCallFrames"))
417 .ToLocalChecked()); 421 .ToLocalChecked());
418 if (!v8::debug::Call(debuggerContext(), currentCallFramesFunction, 422 if (!v8::debug::Call(debuggerContext(), currentCallFramesFunction,
419 v8::Integer::New(m_isolate, limit)) 423 v8::Integer::New(m_isolate, limit))
420 .ToLocal(&currentCallFramesV8)) 424 .ToLocal(&currentCallFramesV8))
421 return JavaScriptCallFrames(); 425 return JavaScriptCallFrames();
422 } else { 426 } else {
423 v8::Local<v8::Value> argv[] = {m_executionState, 427 v8::Local<v8::Value> argv[] = {m_executionState,
424 v8::Integer::New(m_isolate, limit)}; 428 v8::Integer::New(m_isolate, limit)};
425 if (!callDebuggerMethod("currentCallFrames", arraysize(argv), argv) 429 if (!callDebuggerMethod("currentCallFrames", arraysize(argv), argv, true)
426 .ToLocal(&currentCallFramesV8)) 430 .ToLocal(&currentCallFramesV8))
427 return JavaScriptCallFrames(); 431 return JavaScriptCallFrames();
428 } 432 }
429 DCHECK(!currentCallFramesV8.IsEmpty()); 433 DCHECK(!currentCallFramesV8.IsEmpty());
430 if (!currentCallFramesV8->IsArray()) return JavaScriptCallFrames(); 434 if (!currentCallFramesV8->IsArray()) return JavaScriptCallFrames();
431 v8::Local<v8::Array> callFramesArray = currentCallFramesV8.As<v8::Array>(); 435 v8::Local<v8::Array> callFramesArray = currentCallFramesV8.As<v8::Array>();
432 JavaScriptCallFrames callFrames; 436 JavaScriptCallFrames callFrames;
433 for (uint32_t i = 0; i < callFramesArray->Length(); ++i) { 437 for (uint32_t i = 0; i < callFramesArray->Length(); ++i) {
434 v8::Local<v8::Value> callFrameValue; 438 v8::Local<v8::Value> callFrameValue;
435 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) 439 if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue))
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 V8DebuggerScript::Create(m_isolate, script, inLiveEditScope), 533 V8DebuggerScript::Create(m_isolate, script, inLiveEditScope),
530 !has_compile_error); 534 !has_compile_error);
531 } 535 }
532 } 536 }
533 537
534 void V8Debugger::BreakProgramRequested(v8::Local<v8::Context> pausedContext, 538 void V8Debugger::BreakProgramRequested(v8::Local<v8::Context> pausedContext,
535 v8::Local<v8::Object> execState, 539 v8::Local<v8::Object> execState,
536 v8::Local<v8::Value> breakPointsHit) { 540 v8::Local<v8::Value> breakPointsHit) {
537 v8::Local<v8::Value> argv[] = {breakPointsHit}; 541 v8::Local<v8::Value> argv[] = {breakPointsHit};
538 v8::Local<v8::Value> hitBreakpoints; 542 v8::Local<v8::Value> hitBreakpoints;
539 if (!callDebuggerMethod("getBreakpointNumbers", 1, argv) 543 if (!callDebuggerMethod("getBreakpointNumbers", 1, argv, true)
540 .ToLocal(&hitBreakpoints)) { 544 .ToLocal(&hitBreakpoints)) {
541 return; 545 return;
542 } 546 }
543 DCHECK(hitBreakpoints->IsArray()); 547 DCHECK(hitBreakpoints->IsArray());
544 handleProgramBreak(pausedContext, execState, v8::Local<v8::Value>(), 548 handleProgramBreak(pausedContext, execState, v8::Local<v8::Value>(),
545 hitBreakpoints.As<v8::Array>()); 549 hitBreakpoints.As<v8::Array>());
546 } 550 }
547 551
548 void V8Debugger::ExceptionThrown(v8::Local<v8::Context> pausedContext, 552 void V8Debugger::ExceptionThrown(v8::Local<v8::Context> pausedContext,
549 v8::Local<v8::Object> execState, 553 v8::Local<v8::Object> execState,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 const char* debuggerMethod = nullptr; 645 const char* debuggerMethod = nullptr;
642 switch (kind) { 646 switch (kind) {
643 case FUNCTION: 647 case FUNCTION:
644 debuggerMethod = "getFunctionScopes"; 648 debuggerMethod = "getFunctionScopes";
645 break; 649 break;
646 case GENERATOR: 650 case GENERATOR:
647 debuggerMethod = "getGeneratorScopes"; 651 debuggerMethod = "getGeneratorScopes";
648 break; 652 break;
649 } 653 }
650 654
651 if (!callDebuggerMethod(debuggerMethod, 1, argv).ToLocal(&scopesValue)) 655 if (!callDebuggerMethod(debuggerMethod, 1, argv, true).ToLocal(&scopesValue))
652 return v8::MaybeLocal<v8::Value>(); 656 return v8::MaybeLocal<v8::Value>();
653 v8::Local<v8::Value> copied; 657 v8::Local<v8::Value> copied;
654 if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, 658 if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context,
655 scopesValue) 659 scopesValue)
656 .ToLocal(&copied) || 660 .ToLocal(&copied) ||
657 !copied->IsArray()) 661 !copied->IsArray())
658 return v8::MaybeLocal<v8::Value>(); 662 return v8::MaybeLocal<v8::Value>();
659 if (!markAsInternal(context, v8::Local<v8::Array>::Cast(copied), 663 if (!markAsInternal(context, v8::Local<v8::Array>::Cast(copied),
660 V8InternalValueType::kScopeList)) 664 V8InternalValueType::kScopeList))
661 return v8::MaybeLocal<v8::Value>(); 665 return v8::MaybeLocal<v8::Value>();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 } 742 }
739 743
740 v8::Local<v8::Value> V8Debugger::collectionEntries( 744 v8::Local<v8::Value> V8Debugger::collectionEntries(
741 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { 745 v8::Local<v8::Context> context, v8::Local<v8::Object> object) {
742 if (!enabled()) { 746 if (!enabled()) {
743 UNREACHABLE(); 747 UNREACHABLE();
744 return v8::Undefined(m_isolate); 748 return v8::Undefined(m_isolate);
745 } 749 }
746 v8::Local<v8::Value> argv[] = {object}; 750 v8::Local<v8::Value> argv[] = {object};
747 v8::Local<v8::Value> entriesValue; 751 v8::Local<v8::Value> entriesValue;
748 if (!callDebuggerMethod("getCollectionEntries", 1, argv) 752 if (!callDebuggerMethod("getCollectionEntries", 1, argv, true)
749 .ToLocal(&entriesValue) || 753 .ToLocal(&entriesValue) ||
750 !entriesValue->IsArray()) 754 !entriesValue->IsArray())
751 return v8::Undefined(m_isolate); 755 return v8::Undefined(m_isolate);
752 756
753 v8::Local<v8::Array> entries = entriesValue.As<v8::Array>(); 757 v8::Local<v8::Array> entries = entriesValue.As<v8::Array>();
754 v8::Local<v8::Array> copiedArray = 758 v8::Local<v8::Array> copiedArray =
755 v8::Array::New(m_isolate, entries->Length()); 759 v8::Array::New(m_isolate, entries->Length());
756 if (!copiedArray->SetPrototype(context, v8::Null(m_isolate)).FromMaybe(false)) 760 if (!copiedArray->SetPrototype(context, v8::Null(m_isolate)).FromMaybe(false))
757 return v8::Undefined(m_isolate); 761 return v8::Undefined(m_isolate);
758 for (uint32_t i = 0; i < entries->Length(); ++i) { 762 for (uint32_t i = 0; i < entries->Length(); ++i) {
(...skipping 17 matching lines...) Expand all
776 780
777 v8::Local<v8::Value> V8Debugger::generatorObjectLocation( 781 v8::Local<v8::Value> V8Debugger::generatorObjectLocation(
778 v8::Local<v8::Context> context, v8::Local<v8::Object> object) { 782 v8::Local<v8::Context> context, v8::Local<v8::Object> object) {
779 if (!enabled()) { 783 if (!enabled()) {
780 UNREACHABLE(); 784 UNREACHABLE();
781 return v8::Null(m_isolate); 785 return v8::Null(m_isolate);
782 } 786 }
783 v8::Local<v8::Value> argv[] = {object}; 787 v8::Local<v8::Value> argv[] = {object};
784 v8::Local<v8::Value> location; 788 v8::Local<v8::Value> location;
785 v8::Local<v8::Value> copied; 789 v8::Local<v8::Value> copied;
786 if (!callDebuggerMethod("getGeneratorObjectLocation", 1, argv) 790 if (!callDebuggerMethod("getGeneratorObjectLocation", 1, argv, true)
787 .ToLocal(&location) || 791 .ToLocal(&location) ||
788 !copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, 792 !copyValueFromDebuggerContext(m_isolate, debuggerContext(), context,
789 location) 793 location)
790 .ToLocal(&copied) || 794 .ToLocal(&copied) ||
791 !copied->IsObject()) 795 !copied->IsObject())
792 return v8::Null(m_isolate); 796 return v8::Null(m_isolate);
793 if (!markAsInternal(context, v8::Local<v8::Object>::Cast(copied), 797 if (!markAsInternal(context, v8::Local<v8::Object>::Cast(copied),
794 V8InternalValueType::kLocation)) 798 V8InternalValueType::kLocation))
795 return v8::Null(m_isolate); 799 return v8::Null(m_isolate);
796 return copied; 800 return copied;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 966
963 size_t stackSize = 967 size_t stackSize =
964 fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; 968 fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1;
965 if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) 969 if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId))
966 stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; 970 stackSize = V8StackTraceImpl::maxCallStackSizeToCapture;
967 971
968 return V8StackTraceImpl::capture(this, contextGroupId, stackSize); 972 return V8StackTraceImpl::capture(this, contextGroupId, stackSize);
969 } 973 }
970 974
971 } // namespace v8_inspector 975 } // namespace v8_inspector
OLDNEW
« no previous file with comments | « src/inspector/v8-debugger.h ('k') | test/inspector/debugger/set-script-source-exception.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698