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

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

Issue 2493773003: [inspector] Introduce translation of wasm frames (Closed)
Patch Set: Address comments Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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-agent-impl.h" 5 #include "src/inspector/v8-debugger-agent-impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "src/debug/debug-interface.h" 9 #include "src/debug/debug-interface.h"
10 #include "src/inspector/injected-script.h" 10 #include "src/inspector/injected-script.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 m_isolate(m_inspector->isolate()), 113 m_isolate(m_inspector->isolate()),
114 m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other), 114 m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other),
115 m_scheduledDebuggerStep(NoStep), 115 m_scheduledDebuggerStep(NoStep),
116 m_skipNextDebuggerStepOut(false), 116 m_skipNextDebuggerStepOut(false),
117 m_javaScriptPauseScheduled(false), 117 m_javaScriptPauseScheduled(false),
118 m_steppingFromFramework(false), 118 m_steppingFromFramework(false),
119 m_pausingOnNativeEvent(false), 119 m_pausingOnNativeEvent(false),
120 m_skippedStepFrameCount(0), 120 m_skippedStepFrameCount(0),
121 m_recursionLevelForStepOut(0), 121 m_recursionLevelForStepOut(0),
122 m_recursionLevelForStepFrame(0), 122 m_recursionLevelForStepFrame(0),
123 m_skipAllPauses(false) { 123 m_skipAllPauses(false),
124 m_wasmTranslation(m_isolate, this) {
124 clearBreakDetails(); 125 clearBreakDetails();
125 } 126 }
126 127
127 V8DebuggerAgentImpl::~V8DebuggerAgentImpl() {} 128 V8DebuggerAgentImpl::~V8DebuggerAgentImpl() {}
128 129
129 void V8DebuggerAgentImpl::enableImpl() { 130 void V8DebuggerAgentImpl::enableImpl() {
130 // m_inspector->addListener may result in reporting all parsed scripts to 131 // m_inspector->addListener may result in reporting all parsed scripts to
131 // the agent so it should already be in enabled state by then. 132 // the agent so it should already be in enabled state by then.
132 m_enabled = true; 133 m_enabled = true;
133 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); 134 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 m_javaScriptPauseScheduled = false; 181 m_javaScriptPauseScheduled = false;
181 m_steppingFromFramework = false; 182 m_steppingFromFramework = false;
182 m_pausingOnNativeEvent = false; 183 m_pausingOnNativeEvent = false;
183 m_skippedStepFrameCount = 0; 184 m_skippedStepFrameCount = 0;
184 m_recursionLevelForStepFrame = 0; 185 m_recursionLevelForStepFrame = 0;
185 m_skipAllPauses = false; 186 m_skipAllPauses = false;
186 m_blackboxPattern = nullptr; 187 m_blackboxPattern = nullptr;
187 m_state->remove(DebuggerAgentState::blackboxPattern); 188 m_state->remove(DebuggerAgentState::blackboxPattern);
188 m_enabled = false; 189 m_enabled = false;
189 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); 190 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false);
191 m_wasmTranslation.Clear();
190 return Response::OK(); 192 return Response::OK();
191 } 193 }
192 194
193 void V8DebuggerAgentImpl::restore() { 195 void V8DebuggerAgentImpl::restore() {
194 DCHECK(!m_enabled); 196 DCHECK(!m_enabled);
195 if (!m_state->booleanProperty(DebuggerAgentState::debuggerEnabled, false)) 197 if (!m_state->booleanProperty(DebuggerAgentState::debuggerEnabled, false))
196 return; 198 return;
197 if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) 199 if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId()))
198 return; 200 return;
199 201
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 DCHECK(enabled()); 498 DCHECK(enabled());
497 // FIXME: remove these checks once crbug.com/520702 is resolved. 499 // FIXME: remove these checks once crbug.com/520702 is resolved.
498 CHECK(!breakpointId.isEmpty()); 500 CHECK(!breakpointId.isEmpty());
499 CHECK(!breakpoint.script_id.isEmpty()); 501 CHECK(!breakpoint.script_id.isEmpty());
500 ScriptsMap::iterator scriptIterator = m_scripts.find(breakpoint.script_id); 502 ScriptsMap::iterator scriptIterator = m_scripts.find(breakpoint.script_id);
501 if (scriptIterator == m_scripts.end()) return nullptr; 503 if (scriptIterator == m_scripts.end()) return nullptr;
502 if (breakpoint.line_number < scriptIterator->second->startLine() || 504 if (breakpoint.line_number < scriptIterator->second->startLine() ||
503 scriptIterator->second->endLine() < breakpoint.line_number) 505 scriptIterator->second->endLine() < breakpoint.line_number)
504 return nullptr; 506 return nullptr;
505 507
508 ScriptBreakpoint translatedBreakpoint(breakpoint);
509 m_wasmTranslation.TranslateBack(&translatedBreakpoint);
510
506 int actualLineNumber; 511 int actualLineNumber;
507 int actualColumnNumber; 512 int actualColumnNumber;
508 String16 debuggerBreakpointId = m_debugger->setBreakpoint( 513 String16 debuggerBreakpointId = m_debugger->setBreakpoint(
509 breakpoint, &actualLineNumber, &actualColumnNumber); 514 translatedBreakpoint, &actualLineNumber, &actualColumnNumber);
510 if (debuggerBreakpointId.isEmpty()) return nullptr; 515 if (debuggerBreakpointId.isEmpty()) return nullptr;
511 516
512 m_serverBreakpoints[debuggerBreakpointId] = 517 m_serverBreakpoints[debuggerBreakpointId] =
513 std::make_pair(breakpointId, source); 518 std::make_pair(breakpointId, source);
514 CHECK(!breakpointId.isEmpty()); 519 CHECK(!breakpointId.isEmpty());
515 520
516 m_breakpointIdToDebuggerBreakpointIds[breakpointId].push_back( 521 m_breakpointIdToDebuggerBreakpointIds[breakpointId].push_back(
517 debuggerBreakpointId); 522 debuggerBreakpointId);
518 return buildProtocolLocation(breakpoint.script_id, actualLineNumber, 523 return buildProtocolLocation(translatedBreakpoint.script_id, actualLineNumber,
519 actualColumnNumber); 524 actualColumnNumber);
520 } 525 }
521 526
522 Response V8DebuggerAgentImpl::searchInContent( 527 Response V8DebuggerAgentImpl::searchInContent(
523 const String16& scriptId, const String16& query, 528 const String16& scriptId, const String16& query,
524 Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex, 529 Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex,
525 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) { 530 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) {
526 v8::HandleScope handles(m_isolate); 531 v8::HandleScope handles(m_isolate);
527 ScriptsMap::iterator it = m_scripts.find(scriptId); 532 ScriptsMap::iterator it = m_scripts.find(scriptId);
528 if (it == m_scripts.end()) 533 if (it == m_scripts.end())
529 return Response::Error("No script for id: " + scriptId); 534 return Response::Error("No script for id: " + scriptId);
530 535
531 std::vector<std::unique_ptr<protocol::Debugger::SearchMatch>> matches = 536 std::vector<std::unique_ptr<protocol::Debugger::SearchMatch>> matches =
532 searchInTextByLinesImpl(m_session, 537 searchInTextByLinesImpl(m_session, it->second->source(m_isolate), query,
533 toProtocolString(it->second->source(m_isolate)), 538 optionalCaseSensitive.fromMaybe(false),
534 query, optionalCaseSensitive.fromMaybe(false),
535 optionalIsRegex.fromMaybe(false)); 539 optionalIsRegex.fromMaybe(false));
536 *results = protocol::Array<protocol::Debugger::SearchMatch>::create(); 540 *results = protocol::Array<protocol::Debugger::SearchMatch>::create();
537 for (size_t i = 0; i < matches.size(); ++i) 541 for (size_t i = 0; i < matches.size(); ++i)
538 (*results)->addItem(std::move(matches[i])); 542 (*results)->addItem(std::move(matches[i]));
539 return Response::OK(); 543 return Response::OK();
540 } 544 }
541 545
542 Response V8DebuggerAgentImpl::setScriptSource( 546 Response V8DebuggerAgentImpl::setScriptSource(
543 const String16& scriptId, const String16& newContent, Maybe<bool> dryRun, 547 const String16& scriptId, const String16& newContent, Maybe<bool> dryRun,
544 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, 548 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 return Response::OK(); 599 return Response::OK();
596 } 600 }
597 601
598 Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId, 602 Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId,
599 String16* scriptSource) { 603 String16* scriptSource) {
600 if (!enabled()) return Response::Error(kDebuggerNotEnabled); 604 if (!enabled()) return Response::Error(kDebuggerNotEnabled);
601 ScriptsMap::iterator it = m_scripts.find(scriptId); 605 ScriptsMap::iterator it = m_scripts.find(scriptId);
602 if (it == m_scripts.end()) 606 if (it == m_scripts.end())
603 return Response::Error("No script for id: " + scriptId); 607 return Response::Error("No script for id: " + scriptId);
604 v8::HandleScope handles(m_isolate); 608 v8::HandleScope handles(m_isolate);
605 *scriptSource = toProtocolString(it->second->source(m_isolate)); 609 *scriptSource = it->second->source(m_isolate);
606 return Response::OK(); 610 return Response::OK();
607 } 611 }
608 612
609 void V8DebuggerAgentImpl::schedulePauseOnNextStatement( 613 void V8DebuggerAgentImpl::schedulePauseOnNextStatement(
610 const String16& breakReason, 614 const String16& breakReason,
611 std::unique_ptr<protocol::DictionaryValue> data) { 615 std::unique_ptr<protocol::DictionaryValue> data) {
612 if (!enabled() || m_scheduledDebuggerStep == StepInto || 616 if (!enabled() || m_scheduledDebuggerStep == StepInto ||
613 m_javaScriptPauseScheduled || m_debugger->isPaused() || 617 m_javaScriptPauseScheduled || m_debugger->isPaused() ||
614 !m_debugger->breakpointsActivated()) 618 !m_debugger->breakpointsActivated())
615 return; 619 return;
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 changeJavaScriptRecursionLevel(+1); 858 changeJavaScriptRecursionLevel(+1);
855 // Fast return. 859 // Fast return.
856 if (m_scheduledDebuggerStep != StepInto) return; 860 if (m_scheduledDebuggerStep != StepInto) return;
857 schedulePauseOnNextStatementIfSteppingInto(); 861 schedulePauseOnNextStatementIfSteppingInto();
858 } 862 }
859 863
860 void V8DebuggerAgentImpl::didExecuteScript() { 864 void V8DebuggerAgentImpl::didExecuteScript() {
861 changeJavaScriptRecursionLevel(-1); 865 changeJavaScriptRecursionLevel(-1);
862 } 866 }
863 867
868 void V8DebuggerAgentImpl::newWasmScript(v8::Local<v8::Object> scriptWrapper) {
869 m_wasmTranslation.AddScript(scriptWrapper);
870 }
871
864 void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step) { 872 void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step) {
865 if (m_javaScriptPauseScheduled && !m_skipAllPauses && 873 if (m_javaScriptPauseScheduled && !m_skipAllPauses &&
866 !m_debugger->isPaused()) { 874 !m_debugger->isPaused()) {
867 // Do not ever loose user's pause request until we have actually paused. 875 // Do not ever loose user's pause request until we have actually paused.
868 m_debugger->setPauseOnNextStatement(true); 876 m_debugger->setPauseOnNextStatement(true);
869 } 877 }
870 if (m_scheduledDebuggerStep == StepOut) { 878 if (m_scheduledDebuggerStep == StepOut) {
871 m_recursionLevelForStepOut += step; 879 m_recursionLevelForStepOut += step;
872 if (!m_recursionLevelForStepOut) { 880 if (!m_recursionLevelForStepOut) {
873 // When StepOut crosses a task boundary (i.e. js -> c++) from where it was 881 // When StepOut crosses a task boundary (i.e. js -> c++) from where it was
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 return Response::InternalError(); 1005 return Response::InternalError();
998 } 1006 }
999 } 1007 }
1000 1008
1001 std::unique_ptr<protocol::Value> protocolValue; 1009 std::unique_ptr<protocol::Value> protocolValue;
1002 Response response = toProtocolValue(debuggerContext, objects, &protocolValue); 1010 Response response = toProtocolValue(debuggerContext, objects, &protocolValue);
1003 if (!response.isSuccess()) return response; 1011 if (!response.isSuccess()) return response;
1004 protocol::ErrorSupport errorSupport; 1012 protocol::ErrorSupport errorSupport;
1005 *result = Array<CallFrame>::parse(protocolValue.get(), &errorSupport); 1013 *result = Array<CallFrame>::parse(protocolValue.get(), &errorSupport);
1006 if (!*result) return Response::Error(errorSupport.errors()); 1014 if (!*result) return Response::Error(errorSupport.errors());
1015 for (size_t i = 0, e = (*result)->length(); i != e; ++i)
1016 m_wasmTranslation.Translate((*result)->get(i)->getLocation());
1007 return Response::OK(); 1017 return Response::OK();
1008 } 1018 }
1009 1019
1010 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() { 1020 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() {
1011 if (m_pausedContext.IsEmpty()) return nullptr; 1021 if (m_pausedContext.IsEmpty()) return nullptr;
1012 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); 1022 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain();
1013 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) 1023 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger)
1014 : nullptr; 1024 : nullptr;
1015 } 1025 }
1016 1026
1017 void V8DebuggerAgentImpl::didParseSource( 1027 void V8DebuggerAgentImpl::didParseSource(
1018 std::unique_ptr<V8DebuggerScript> script, bool success) { 1028 std::unique_ptr<V8DebuggerScript> script, bool success) {
1019 v8::HandleScope handles(m_isolate); 1029 v8::HandleScope handles(m_isolate);
1020 String16 scriptSource = toProtocolString(script->source(m_isolate)); 1030 String16 scriptSource = script->source(m_isolate);
1021 if (!success) script->setSourceURL(findSourceURL(scriptSource, false)); 1031 if (!success) script->setSourceURL(findSourceURL(scriptSource, false));
1022 if (!success) 1032 if (!success)
1023 script->setSourceMappingURL(findSourceMapURL(scriptSource, false)); 1033 script->setSourceMappingURL(findSourceMapURL(scriptSource, false));
1024 1034
1025 std::unique_ptr<protocol::DictionaryValue> executionContextAuxData; 1035 std::unique_ptr<protocol::DictionaryValue> executionContextAuxData;
1026 if (!script->executionContextAuxData().isEmpty()) 1036 if (!script->executionContextAuxData().isEmpty())
1027 executionContextAuxData = protocol::DictionaryValue::cast( 1037 executionContextAuxData = protocol::DictionaryValue::cast(
1028 protocol::parseJSON(script->executionContextAuxData())); 1038 protocol::parseJSON(script->executionContextAuxData()));
1029 bool isLiveEdit = script->isLiveEdit(); 1039 bool isLiveEdit = script->isLiveEdit();
1030 bool hasSourceURL = script->hasSourceURL(); 1040 bool hasSourceURL = script->hasSourceURL();
1031 String16 scriptId = script->scriptId(); 1041 String16 scriptId = script->scriptId();
1032 String16 scriptURL = script->sourceURL(); 1042 String16 scriptURL = script->sourceURL();
1033 1043
1034 m_scripts[scriptId] = std::move(script); 1044 m_scripts[scriptId] = std::move(script);
1035 1045
1036 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); 1046 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId);
1037 DCHECK(scriptIterator != m_scripts.end()); 1047 DCHECK(scriptIterator != m_scripts.end());
1038 V8DebuggerScript* scriptRef = scriptIterator->second.get(); 1048 V8DebuggerScript* scriptRef = scriptIterator->second.get();
1039 1049
1040 Maybe<String16> sourceMapURLParam = scriptRef->sourceMappingURL(); 1050 Maybe<String16> sourceMapURLParam = scriptRef->sourceMappingURL();
1041 Maybe<protocol::DictionaryValue> executionContextAuxDataParam( 1051 Maybe<protocol::DictionaryValue> executionContextAuxDataParam(
1042 std::move(executionContextAuxData)); 1052 std::move(executionContextAuxData));
1043 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; 1053 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr;
1044 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; 1054 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr;
1045 if (success) 1055 if (success)
1046 m_frontend.scriptParsed( 1056 m_frontend.scriptParsed(
1047 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), 1057 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(),
1048 scriptRef->endLine(), scriptRef->endColumn(), 1058 scriptRef->endLine(), scriptRef->endColumn(),
1049 scriptRef->executionContextId(), scriptRef->hash(), 1059 scriptRef->executionContextId(), scriptRef->hash(m_isolate),
1050 std::move(executionContextAuxDataParam), isLiveEditParam, 1060 std::move(executionContextAuxDataParam), isLiveEditParam,
1051 std::move(sourceMapURLParam), hasSourceURLParam); 1061 std::move(sourceMapURLParam), hasSourceURLParam);
1052 else 1062 else
1053 m_frontend.scriptFailedToParse( 1063 m_frontend.scriptFailedToParse(
1054 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), 1064 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(),
1055 scriptRef->endLine(), scriptRef->endColumn(), 1065 scriptRef->endLine(), scriptRef->endColumn(),
1056 scriptRef->executionContextId(), scriptRef->hash(), 1066 scriptRef->executionContextId(), scriptRef->hash(m_isolate),
1057 std::move(executionContextAuxDataParam), std::move(sourceMapURLParam), 1067 std::move(executionContextAuxDataParam), std::move(sourceMapURLParam),
1058 hasSourceURLParam); 1068 hasSourceURLParam);
1059 1069
1060 if (scriptURL.isEmpty() || !success) return; 1070 if (scriptURL.isEmpty() || !success) return;
1061 1071
1062 protocol::DictionaryValue* breakpointsCookie = 1072 protocol::DictionaryValue* breakpointsCookie =
1063 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); 1073 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints);
1064 if (!breakpointsCookie) return; 1074 if (!breakpointsCookie) return;
1065 1075
1066 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { 1076 for (size_t i = 0; i < breakpointsCookie->size(); ++i) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 } 1244 }
1235 1245
1236 void V8DebuggerAgentImpl::reset() { 1246 void V8DebuggerAgentImpl::reset() {
1237 if (!enabled()) return; 1247 if (!enabled()) return;
1238 m_scheduledDebuggerStep = NoStep; 1248 m_scheduledDebuggerStep = NoStep;
1239 m_scripts.clear(); 1249 m_scripts.clear();
1240 m_blackboxedPositions.clear(); 1250 m_blackboxedPositions.clear();
1241 m_breakpointIdToDebuggerBreakpointIds.clear(); 1251 m_breakpointIdToDebuggerBreakpointIds.clear();
1242 } 1252 }
1243 1253
1254 void V8DebuggerAgentImpl::translateLocation(String16* scriptId, int* lineNumber,
1255 int* columnNumber) {
1256 m_wasmTranslation.Translate(scriptId, lineNumber, columnNumber);
1257 }
1258
1244 } // namespace v8_inspector 1259 } // namespace v8_inspector
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698